管理系統中的各個設備是內核的任務,內核可以通過2中方式來實現。
1、 輪詢:以一定的時間來訪問設備,參看其狀態並處理。
2、 中斷:設備向內核發送請求,內核再來完成處理。
中斷的分類:中斷可分為同步中斷和異步中斷。
同步中斷是由cpu產生的,又稱為內部中斷。這裡的同步是指中斷指令信號和代碼同時執行,在一條代碼執行完後,才會產生中斷信號,而不是執行期間。通常產生於cpu在執行期間檢測到異常或非法條件時,與當前的指令有直接的關系,如除數為0.
異步中斷由其它硬件產生,又稱為外部中斷。異步中斷可以在任何期間產生,包括指令執行期間。
通常情況下,把同步中斷稱為異常,把異步中斷稱為中斷。
異常分為:故障(fault)陷阱(trap)中止(abort)。
故障:在引起故障的指令之前把異常情況通知為系統的一種異常。換回到原來的位置後繼續執行。
陷阱:svc
中止:系統出現嚴重的情況時,通知系統的一種異常。引起中止的命令是無法預測的。產生中止時,正在執行的出現無法恢復。
查看本欄目更多精彩內容:http://www.bianceng.cn/OS/unix/
中斷:又分為可屏蔽中斷和非屏蔽中斷。
中斷控制器:有可編程中斷控制器(PIC)用於但處理平台,如8259A。高級可編程中斷控制器(APIC)可以用於多處理器控制器中。
單個8259A只能管理8個中斷源,通過級聯的方式最多可管理64個中斷源。
無論是中斷還是異常。cpu相應的過程基本是一致的,根據中斷源跳到相應的地址中執行處理程序。
中斷API:
內核提供了一組API接口用於控制中斷。了解這些是驅動開發的基本功。
1、 注冊和釋放
IRQ線是非常寶貴的資源。驅動程序在使用時要注冊,不用時要釋放掉。
request_irq在include/linux/interrupt.h中聲明。
request_irq(unsigned int irq, irq_handler_thandler, unsigned long flags, const char *name, void *dev);
irq:要申請的irq號,很多設備的IRQ號都是預先設定好的,如鍵盤設備和系統時鐘。
handler:注冊的中斷服務程序。
flags:中斷類型標識,IRQF_SHARED表示和其他設備共享同一條IRQ線。IRQ_DISABLE表示在本地cpu上,中斷處理程序在運行時禁止所有中斷,這樣就不受其他中斷的影響。若沒有此標志,在只禁止該中斷處理程序對應的中斷號,不受此類型中斷的干擾。IRQF_SAMPLE_RANDOM:表示這個中斷能夠產生內核熵。
name:中斷源的名稱,在/proc/interrupts文件中可看到。
dev:傳遞給hander的參數。
返回0.表示成功,該IRQ被激活。返回非零則失敗。常見的錯誤時-EBUSY表示該IRQ已被占用。
注:為了避免中斷處理程序在設備初始化完成之前調用,初始化硬件和IRQ的注冊順序要正確。
free_irq卸載設備驅動程序時,必須調用此函數來刪除中斷請求隊列中對應的irqaction節點,並釋放中斷線。如果IRQ不是共享的,則在刪除irqaction節點後,立即禁止該IRQ線。否則只刪除對應的irqaction節點,等到該IRQ線在中斷請求隊列中的所有irqaction都刪除時才禁止該中斷線。