以前に登録した別のプロセスをスケジュールするために、割り込みハンドラーでコンテキストスイッチを実行することは可能ですか?もしそうなら、どのように?
3 に答える
あなたの質問を正しく理解できるかどうかはわかりませんが、作業の延期について言及していますか?
タスクレットなどを使用してISRでの作業を延期する方法が確立されています。
ユーザープロセスをスケジュールする場合、1つの方法は、ユーザースレッドを(カーネル内の)セマフォにペンディングし、ISRでセマフォを突くことです。
まず、割り込みセクション、つまり上半分でコンテキストを切り替えることはできません。
ただし、割り込みコンテキストまたはプロセスコンテキストで実行するように別の関数をスケジュールすることができます。これを実現する方法は、割り込みハンドラの下半分です。
1:登録した関数を割り込みコンテキストで実行するようにスケジュールする場合は、タスクレットを使用します。
DECLARE_TASKLET(my_tasklet、functionname、0);
irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
tasklet_schedule(&my_tasklet);
return IRQ_HANDLED;
}
2:登録された関数をプロセスコンテキストで実行するようにスケジュールする場合は、ワークキューを使用します。
INIT_WORK(&my_wq、(void(*)(void *))functionname、NULL);
irqreturn_t my_tl_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
schedule_work(&short_wq);
return IRQ_HANDLED;
}
いいえ、割り込みコンテキストでコンテキスト スイッチを作成することはできません。スケジューラが無効になっているため、割り込みコンテキストで実行されているタスクを横取りできません。
下半分の場合、softirq とタスクレットの両方が割り込みコンテキストで実行されるため、スリープ呼び出しのようなコンテキスト スイッチは許可されません。ただし、ワーク キューの下半分の場合、プロセス コンテキスト ksoftirqd で実行されるため、コンテキスト スイッチが可能です。