Linux
時間中斷後總是跟調度程序呼叫嗎?
當發生定時器中斷時,將呼叫 ISR 來處理中斷。
可以假設每個定時器中斷都以呼叫調度程序結束,接下來應該繼續執行哪個程序?
可以概括地說每個中斷都必須以調度程序呼叫結束嗎?
定時器 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
則呼叫。