システムコールエントリ

Intel CPUにおいては、システムコールはint命令を用いて実現されている。プロセスがシステムコールを発行すると、CPUの状態がユーザモードからカーネルモードに切り替わり、以下のsystem_callへ飛んでくる。システムコール番号をインデックスとして、sys_call_table[]テーブルを引き、目的のシステムコールを実行する。

img17.gif

システムコール復帰時には、システムコール処理中に様々な状態の変化が発生している可能性があるため、以下の順番でチェックを行ない、必要ならそれに対応した処理を行う。

  1. BHハンドラが実行待ちになら、BHハンドラを呼び出す。
  2. このプロセスに対し再スケジーリング(プリエンプト要求)が発生していたら、 CPUを明け渡す。
  3. このプロセスがシグナルを受けている場合、シグナル処理の準備を行う。
     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秒 JST
1