Intel CPUにおいては、システムコールはint命令を用いて実現されている。プロセスがシステムコールを発行すると、CPUの状態がユーザモードからカーネルモードに切り替わり、以下のsystem_callへ飛んでくる。システムコール番号をインデックスとして、sys_call_table[]テーブルを引き、目的のシステムコールを実行する。
システムコール復帰時には、システムコール処理中に様々な状態の変化が発生している可能性があるため、以下の順番でチェックを行ない、必要ならそれに対応した処理を行う。
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
2000年12月09日 (土) 23時55分06秒 JST1