管理系統中的各個裝置是核心的任務,核心可以通過2中方式來實現。
1、 輪詢:以一定的時間來訪問裝置,參看其狀態並處理。
2、 中斷:裝置向核心傳送請求,核心再來完成處理。
中斷的分類:
中斷可分為同步中斷和非同步中斷。
同步中斷是由cpu產生的,又稱為內部中斷。這裡的同步是指中斷指令訊號和**同時執行,在一條**執行完後,才會產生中斷訊號,而不是執行期間。通常產生於cpu在執行期間檢測到異常或非法條件時,與當前的指令有直接的關係,如除數為0.
非同步中斷由其它硬體產生,又稱為外部中斷。非同步中斷可以在任何期間產生,包括指令執行期間。
通常情況下,把同步中斷稱為異常,把非同步中斷稱為中斷。
異常分為:故障(fault)陷阱(trap)中止(abort)。
故障:在引起故障的指令之前把異常情況通知為系統的一種異常。換回到原來的位置後繼續執行。
陷阱:svc
中止:系統出現嚴重的情況時,通知系統的一種異常。引起中止的命令是無法**的。產生中止時,正在執行的出現無法恢復。
中斷:又分為可遮蔽中斷和非遮蔽中斷。
中斷控制器:有可程式設計中斷控制器(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的註冊順序要正確。
Kernel中斷處理模型
linux 2.6.25.20 kernel 中斷處理模型結構圖如下 下面簡單介紹一下 1 linux 定義了名字為irq desc的中斷例程描述符表 include linux irq.h struct irqdesc irq desc nr irqs nr irqs 表示中斷源的數目。2 irq...
Kernel中斷處理模型
kernel 中斷處理模型結構圖如下 下面簡單介紹一下 1 linux 定義了名字為irq desc的中斷例程描述符表 include linux irq.h struct irqdesc irq desc nr irqs nr irqs 表示中斷源的數目。2 irq desc 是乙個指向irq d...
關於Kernel的思考
學習播客 klda 推導得很通俗,下面的推導就是源於此篇部落格 第一部分 按照自己的理解,模仿抄!學習播客來完成一下klda的推導。第二部分 對於kernel的思考 klda 顧名思義,就是把kernel運用到了lda上,下面直接推導公式。原始空間資料 x 對映之後資料 phi x 1 j w fr...