LKD6

第六章 中斷和中斷處理程序

1.處理器的速度和外圍硬件的速度不在一個數量級上,所以專門等待硬件的響應時不合理的。
2.輪詢是一種解決的機制,但是內核還是需要做些無用功。更好的機制是中斷機制。
3.中斷使得硬件和處理器進行通信,本質上是一個特殊的電信號,硬件向處理器發送,處理器收到中斷後,告訴操作系統中斷的到來,然後由OS處理這些新來的數據。
4.不同的設備對應不同的中斷。每個中斷通過唯一的數字標識,操作系統給不同的中斷提供不同的中斷處理程序。
5.IRQ線:關鍵是特定的中斷總是與特定的設備相關聯,而且內核知道這些信息。
6.異常再產生是必須考慮與處理器同步。異常也稱爲同步中斷。常見的異常:缺頁處理,軟中斷自陷,0除等。
----------------------------------------------------------------------------------
1.ISR:不是與特定設備相關聯的,而是對應設備的中斷。ISR是驅動程序的一部分。
2.ISR是特定類型聲明的C函數。運行於中斷上下文中。
3.因爲中斷產生的隨意性,中斷處理程序應該儘可能的短下且迅速返回,但是即使是最精簡的ISR,也要同硬件設備進行交互。
4.矛盾的解決方案是分成兩個部分,上半部稱之爲ISR,接收到中斷,立即執行,製作嚴格時限的動作,比如對中斷進行應答等。能夠稍微允許的工作推遲到下半部。
-----------------------------------------------------------------------------------
1.註冊,request_irq()函數。handler的原型是接收三個參數。並且返回類型爲irqreturn_t.
2.SA_interrupt:是指快速中斷,在本地處理器上,快速中斷禁止所有中斷的情況下運行。默認情況沒有次標識。
3.SA_SHIRQ與dev_id的參數,都是用來共享中斷線的。實踐中更多的使用設備結構。
4.request_irq可能會引起睡眠。在註冊過程中,內核需要在/proc/irq蝦米那創建一個與中斷對應的項。proc_mkdir->proc_create->kmalloc,因爲kmalloc可能會引起睡眠。
5.釋放:free_irq(),如果中斷不是共享的,該函數刪除isr並且禁用中斷。
-----------------------------------------------------------------------------------
1.pt_regs的結構參數,包含處理中斷之前處理器的寄存器和狀態,基本上不能使用。
2.中斷處理程序通常被標記成static.
3.Linux系統中,中斷處理程序時無需重入的。當一個isr正在執行時,相應的中斷時被屏蔽的。所以也防止了嵌套。
4.中斷上下文與進程沒有什麼相關,也與current沒什麼瓜葛。中斷上下文不可以睡眠。也不能進行重新調度,任何會引起睡眠的地函數都不能調用。
5.早期,中斷處理程序並不具有自己的棧,而是使用索中斷進程的內核棧。2.6 以後,每個進程的內核棧減小爲一半,而中斷也不再佔用內核棧。而有一頁專用的中斷棧。
------------------------------------------------------------------------------------
1.中斷處理系統非常依賴於體系結構,實現也依賴於處理器,中斷控制器,和體系結構的設計及機器自身。
2.硬件->中斷控制器-〉處理器-〉內核入口-〉do_IRQ()->是否有isr?->handle_IRQ_event->運行中斷處理程序-〉從內核返回。
3./proc/interrupts:與體系結構相關。
4.控制中斷系統的原因歸根到底是需要提供提供。通過禁止中斷,可以確保某個中斷處理程序不會搶佔當前的代碼。禁止中斷也就禁止了內核搶佔,但是都沒有解決多處理器的併發訪問。
5.local_irq_disable()和local_irq_enable():存在潛在的風險。
local_irq_save(flags)和local_irq_restore():保存狀態。必須在同一個函數中執行。flags不能傳遞給另一個函數。
6.禁止指定中斷:屏蔽掉。disable_irq()/disable_irq_nosync,enable_irq,synchronize_irq()
函數只有在當前正在執行的所有處理程序完成後,disable_irq才返回?什麼意思?
disable_irq_nosync不會等待當前中斷處理程序執行完畢,synchronize_irq等待一個 特定的中斷處理程序的推出,如果該處理程序正在執行,該函數必須退出後才能返回?我覺得這裏似乎都沒有說清楚。
7.可以嵌套調用,但是也必須成對出現。後面三個可以從中斷和進程上下文調用,不會睡眠。
-------------------------------------------------------------------------------------1.當前中斷系統的狀態:禁止?激活?是否處於中斷上下文?
irqs_disable()
in_interrupt()和in_irq():是否包含下半部的問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章