[[PageNavi(internal24-navi)]]
{{{ comment
h2w-title:システムコールエントリ
}}}
= システムコールエントリ = #SECTION02510000000000000000
Intel CPUにおいては、システムコールはint命令を用いて実現されている。プロセスがシステムコールを発行すると、CPUの状態がユーザモードからカーネルモードに切り替わり、以下のsystem_callへ飛んでくる。システムコール番号をインデックスとして、sys_call_table[]テーブルを引き、目的のシステムコールを実行する。
[[Embed(internal24-images:img19.gif)]]
システムコール復帰時には、システムコール処理中に様々な状態の変化が発生している可能性があるため、以下の順番でチェックを行ない、必要ならそれに対応した処理を行う。
1. BHハンドラが実行待ちになら、BHハンドラを呼び出す。
1. このプロセスに対し再スケジーリング(プリエンプト要求)が発生していたら、 CPUを明け渡す。
1. このプロセスがシグナルを受けている場合、シグナル処理の準備を行う。
{{{
int (*sys_call_table[])() = {
sys_ni_syscall,
sys_exit,
sys_fork,
sys_read,
sys_write,
sys_open,
sys_....,
sys_....,
:
:
};
system_call()
レジスタのセーブ
ret = (*sys_call_table[システムコール番号])(引き数)
ret_from_sys_call:
if(ソフト割り込み要求がある) ソフト割り込み実行(do_softirq関数)
if(再スケジーリング要求がある) {
スケジューラを呼び出す(schedule関数)
goto ret_from_sys_call
}
ret_with_reschedule:
if(シグナルを受けている) {
シグナルハンドラの起動準備(do_signal関数)
}
レジスタのリカバ
}}}
----
''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1
[[PageNavi(internal24-navi)]]