Linux

時間中斷後總是跟調度程序呼叫嗎?

  • July 29, 2013

當發生定時器中斷時,將呼叫 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_usrret_to_user_from_irq) 或系統呼叫 ( vector_swiret_fast_syscall) 返回到使用者空間。在那裡,核心檢查是否有工作要做,如果需要重新調度,schedule則呼叫。

引用自:https://unix.stackexchange.com/questions/84107