割り込み処理について
[Up]
- 新しい割込みハンドラを定義するには kernel/ITRON/i386 の下
の interrupt.S, fault.c を修正する必要がある.
- タスクの page_fault_handler に関数を登録するためのシステ
ムコールは現時点では用意されていない.
- page_fault_handler は run_task の割り込みのコン
テキストで実行される.
- PAGE FAULT は kernel/ITRON/i386/fault.c の
page_faultで処理される.T_TCB の
page_fault_handler に関数が登録されていればそれが呼び出される
ようになっている.
- def_int システムコールで指定されている intatr
(割込みハンドラ属性)は利用されていない.
- 現在のところ FPU の発生する障害のうち #7 はハンドリングしていない.
浮動小数点ユニットエラーの #16 は fault を呼び出すようになっている.
- task の割り込み許可を出すためには cre_tsk で設定する
cotext の eflags の中の割り込み許可フラグ (IF) を
1 に設定しておくと良い.
- 外部からの割り込みは kernel/ITRON/i386/fault.c の
interrupt() でいったんまとめて受けられた後でそれぞれのハンド
ラー関数が call される.
- device driver の keyboard, fd765a, ide, ne2000 は
def_int でハードウェアの割り込みハンドラーを定義している.他に
clock からの割り込みが発生する.
- keyboard の割り込みハンドラーでは set_flg を呼んでいる.
fd765a では今のところ set_flg は使わないコードを利用している.
- kernel/ITRON/i386/locore.S で定義されている
resume の中で cli(dis_int) と sli(ena_int)
が実行されている.そのため,task_switch() の中で
resume を呼び出す前に ena_int する必要はないようだ.
- kernel/ITRON/i386/interrupt.S では MINIX
のように発生した割り込みをマスクしたうえで EOI
を発行し,それから interrupt() を call する.