割り込みを処理するカーネル モジュールを作成しました。また、Cプログラムもあります。
このプログラムは、実行中に割り込みを発生させます。割り込みが来ると、プログラムは中断され、カーネルモジュールの割り込みハンドラーがこの割り込みの処理を完了するまで中断されたままになります。
それを達成する方法を教えてください。
割り込みを処理するカーネル モジュールを作成しました。また、Cプログラムもあります。
このプログラムは、実行中に割り込みを発生させます。割り込みが来ると、プログラムは中断され、カーネルモジュールの割り込みハンドラーがこの割り込みの処理を完了するまで中断されたままになります。
それを達成する方法を教えてください。
カーネルモジュールが実行している間、属性PTHREAD_PROCESS_SHARED
が設定されたミューテックスを待つことができます。カーネルモジュールが完了すると、プロセスを続行できるようにミューテックスにシグナルを送ることができます。
これを設定するには、次を使用できますpthread_mutexattr_setpshared
これもあります:
プロセス間同期の場合、これらのプロセス間で共有されるメモリにミューテックスを割り当てる必要があります。このようなミューテックスのメモリは動的に割り当てる必要があるため、ミューテックスは、mutex_init() を使用して明示的に初期化する必要があります。
This program causes interrupts during its execution
ユーザースペースプログラムがソフト割り込み/システムコールを実行していて、カーネルシステムコールテーブルを編集し、カスタムシステムコールの番号を割り当て、カスタムシステムコール/ソフト割り込みでカーネルを再コンパイルしてインストールしたと仮定します。
割り込みが来ると、プログラムは中断され、カーネルモジュールの割り込みハンドラーがこの割り込みの処理を完了するまで中断されたままになります。
プログラムがソフト割り込みを呼び出したときにこれが発生するようにするには、irq をアトミックに実行する必要があります。この方法では、プログラムが別のソフト割り込みを呼び出す前に、前の割り込みは、他の割り込みによってプリエンプトされることなく、すぐに処理されます。 、優先度の高い割り込み。この原子性を実現するには、irq ハンドラーでスピンロックを使用できます。
例
spinlock_t mLock = SPIN_LOCK_UNLOCK;
unsigned long flags;
spin_lock_irqsave(&mLock, flags); // save the state, if locked already it is saved in flags
// IRQ Handler Code here
spin_unlock_irqsave(&mLock, flags); // return to the formally state specified in flags