悩んでいる

やりたいことは単純です。
MonaIRQハンドラ(割込みハンドラ)を動的に登録させたい。


あるアプリ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スレッドを実行中に発生するかもしれないし、エディタを実行中に発生するかもしれない。どのプロセスに対して割り込まれるか分からないのだ。


そこでない頭を振り絞って考えた!!その方法とは!  (続く)