例外処理
Rev.6を表示中。最新版はこちら。
例外のエントリポイント
osfmk/i386/locore.s::alltrapsIDTに設定されているエントリポイント
user_trap()もしくはkernel_trap()を呼ぶ
user_trap()もしくはkernel_trap()を呼ぶ
例外処理
user_trap() - User Modeで例外が発生した場合ページフォルトやFPUなどの一部の例外を除いて、i386_exception()を呼び出して例外の発生したプロセスを終了させる。
ページフォルトはvm_fault()で処理をする。ページフォルトには不正なアドレスにアクセスした場合などプロセスを停止させるべきケースと、物理ページの遅延割り当てなど、例外をハンドリング後プロセスの実行を継続すべきケースがある。vm_fault()修了後、呼び出されるuser_page_fault_continue()で処理を別けている。
kernel_trap() - Kernel Modeで例外が発生した場合
<作成中>
例外ベクタテーブルの設定
ディスクリプタテーブルの作成osfmk/i386/idt.s
.data
Entry(idt)
.text
EXCEPTION(0x00,t_zero_div)
<== IDTのエントリを作成してalltrapsへの
ジャンプルーチンを作る EXCEP_SPC(0x01,t_debug)
INTERRUPT(0x02) /* NMI */
EXCEP_USR(0x03,t_int3)
EXCEP_USR(0x04,t_into)
EXCEP_USR(0x05,t_bounds)
EXCEPTION(0x06,t_invop)
:
:
IDTRの設定はstart.s::spag_startで行なう。