2011-11-05 44 views
1

內核如何處理從IRQ中調用的schedule()函數?說,task1調用IRQ0(定時器)的調度,task2從INT 80h恢復(我忘記強制任務切換的系統調用的名稱)。 IRQ「ACK」信號永遠不會被髮送,並且IRQ將停止發送。Linux如何處理從IRQ中調度()的調用?

我指的只是x86個人電腦。我正在爲我自己的小內核(我試圖)編寫Linux調度程序/進程系統進行研究,而且我無法理解我缺少的東西。我知道我錯過了一些事情,因爲Slackware在我的電腦上運行的事實證明了調度程序工作的事實:P

回答

4

簡短的回答是,它沒有。在普通的Linux系統上,ISR上下文被認爲是一個原子上下文,意味着你不應該在任何時候對調度器產生控制。如果某些代碼從中斷上下文調用schedule(),則很可能會得到一個「BUG:調度時原子」打印。

但是,有可能重新調度中斷處理的結束之後的進程,這就是時間中斷偶爾爲了在進程間劃分CPU資源所做的事情。此外,一些打補丁的Linux內核已經將ISR的工作委託給內核線程,在那種情況下,這些特殊的ISR可能會休眠。

+0

調度如何工作呢?我的印象是你必須在0環境切換。否則,像切換內存映射和更改調度程序數據的內容不會被大聲說出。據我所知,從用戶land/ring3切換到ring0的唯一方法是通過中斷或sysenter/exit類型的調用。 – Caleb1994

+0

哦,你也可以通過iret切換戒指。忘了那一個。 – Caleb1994

+0

好的。那麼我越看越......越有意義。我相信我自己的想法正在困擾着我......感謝您的幫助! – Caleb1994

0

通常在sys調用服務之後(服務軟件中斷之後)和系統定時器中斷(特殊硬件中斷)之後進行調度。通常硬件中斷不會強制調度。