悩んでいる
やりたいことは単純です。
MonaでIRQハンドラ(割込みハンドラ)を動的に登録させたい。
あるアプリAのソース
001 void mouseHandler() 002 { 003 // 何らかの処理 004 } 005 006 int main() 007 { 008 /* IRQ12のハンドラを登録 */ 009 syscall_set_irq_handler(12, (void*)mouseHandler); 010 011 for (;;) 012 { 013 // 大事なお仕事 014 } 015 return 0; 016 } 017
マウスがクリックされるとマウス割り込みが発生する。その割込み発生時にmouseHandler()が呼ばれるようにしたいのだ。
こう書くと次のような簡単な解を思いつく方は鋭い。
001 void カーネルのマウスハンドラ() 002 { 003 004 // 登録されたマウスハンドラをcall pは関数ポインタ 005 p(); 006 }
ところがどっこい(表現が古いな)これはうまくいかない。
なぜならば割込みが発生したプロセス空間=登録されたマウスハンドラの空間とは限らないからだ。
ちょっと分かりづらいかもしれないが、割り込みとはいつ発生するものか分からないので、IDLEスレッドを実行中に発生するかもしれないし、エディタを実行中に発生するかもしれない。どのプロセスに対して割り込まれるか分からないのだ。
そこでない頭を振り絞って考えた!!その方法とは! (続く)