歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Unix知識 >> Unix基礎知識

kernel學習之中斷

管理系統中的各個設備是內核的任務,內核可以通過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都刪除時才禁止該中斷線。

Copyright © Linux教程網 All Rights Reserved