Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
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(BHハンドラがある) BHハンドラ実行(do_bottom_half関数) if(再スケジーリング要求がある) { スケジューラを呼び出す(schedule関数) goto ret_from_sys_call } ret_with_reschedule: if(シグナルを受けている) { シグナルハンドラの起動準備(do_signal関数) } レジスタのリカバ
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[ページ情報]
更新日時: 2008-08-27 14:45:26, 更新者: hiromichi-m
[権限]
表示:無制限, 編集:ログインユーザ, 削除/設定:メンバー