FreeBSD 6.3の割り込み
どんな風になってるかちょっと読んでみた。
ふつーの割り込みのばやい
apic_vector.sで定義されてる、ISR_VEC()が各割り込み処理の開始ポイントになってるはず。
まず、PUSH_FRAMEで
#define PUSH_FRAME \ pushl $0 ; /* dummy error code */ \ pushl $0 ; /* dummy trap type */ \ pushal ; /* 8 ints */ \ pushl %ds ; /* save data and extra segments ... */ \ pushl %es ; \ pushl %fs
のように必要なレジスタを全部スタックに積んじゃう。
call lapic_handle_intr ;
でハンドラを呼んで、
jmp doreti ;
でdoretiに飛ぶ。
doretiでは
call ast
でast()を呼んでから、
.globl doreti_popl_fs doreti_popl_fs: popl %fs .globl doreti_popl_es doreti_popl_es: popl %es .globl doreti_popl_ds doreti_popl_ds: popl %ds popal addl $8,%esp .globl doreti_iret doreti_iret: iret
でスタックにつんどいたレジスタを全て戻してreturnする。
となってた。