タイマ割り込みが発生すると、ISR が呼び出され、割り込みを処理します。
すべてのタイマー割り込みがスケジューラ呼び出しで終了し、次のプロセスを実行し続ける必要があると仮定できますか?
すべての割り込みがスケジューラ呼び出しで終わらなければならないと一般化できますか?
答え1
タイマーISRは直接呼び出されませんschedule()
。最後に、update_process_times()
スケジューラプロセスの会計情報が最新の状態になるように呼び出されます。
スケジューラは最終的にユーザ空間に戻ると呼び出されます。カーネルがプリエンプティブの場合、タイマー割り込みからカーネル空間に戻るときにも呼び出されます。
たとえば、プロセスAがデバイス生成割り込みとタイマ割り込みによって中断されるシステムコールを実行するとします。
プロセスAユーザースペース→プロセスAカーネルスペース→デバイスISR→タイマーISR システムコールデバイスIRQタイマーIRQ
タイマーISRが終了すると、別のISRに戻り、カーネル空間に戻り、カーネル空間はユーザー空間に戻ります。プリエンプティブカーネルは、戻るたびにプロセスを再スケジュールする必要があることを確認します。非プリエンプティブカーネルは、ユーザースペースに戻るときにのみこのチェックを実行します。
ARMの世界では、コードパスはおおよそ次のようになります。
- ユーザー空間で受信したIRQは通話を終了し
__irq_usr
、SVCモードで受信したIRQは通話を終了します__irq_svc
。 IRQは他のプロセッサモードで受信しないでください。 - で
__irq_svc
IRQを処理した後、カーネルがプリエンプティブの場合プリエンプションは無効にされず、スケジュールを変更する必要があり、カーネルは呼び出しにジャンプsvc_preempt
します。それ以外の場合、スケジュール変更は発生しません。preempt_schedule_irq
schedule
- 最後に、CPUはIRQハンドラ(
__irq_usr
→ret_to_user_from_irq
)またはシステムコール(vector_swi
→)を介してret_fast_syscall
ユーザースペースに戻ります。ここで、カーネルは何をすべきかを確認し、スケジュールをschedule
再調整する必要があるかどうかを呼び出します。