窺探 kernel 關於中斷

2021-08-26 21:15:02 字數 1450 閱讀 6887

管理系統中的各個裝置是核心的任務,核心可以通過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...