Show page source of internal24-52-システムコールエントリ #25133

[[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)]]