一些簡單基礎的概念就不過多介紹了,著重說一些比較新的和重要的東西
我們對中斷處理程式有兩個要求:一是執行速度快,而是完成的任務量多。鑑於兩者此消彼長的關係,我們將中斷處理分為兩部分
上半部:接受乙個中斷,就立即執行,但只做有嚴格時限的工作,例如對中斷進行應答或復位硬體,這些工作都是在所有中斷被禁止的情況下完成的。在本章,我們主要討論上半部的工作
下半部:能夠允許稍後完成的工作都會推遲到下半部去。在下章,我們主要討論下半部的工作。
第乙個引數是中斷號,第二個是指向中斷處理程式的指標。
中斷處理程式的型別與request_irq中handler所要求的引數型別匹配,dev也與其匹配,此外dev還可能是指向中斷處理程式的乙個資料結構。
值得注意的是,linux中的中斷都是無需重入的,當乙個中斷處理程式正在執行時,相應的中斷線在所有的處理器上都會被遮蔽,這意味著在同一中斷線上不會接受其他中斷,同時,同乙個中斷處理程式絕不會被同時呼叫以處理巢狀中斷。
共享的中斷處理程式:共享的中斷處理程式與非共享的處理程式的差異主要有:(1)flags標誌必須設定為irqf_shared標誌(2)dev必須唯一並且不能使null(3)中斷處理程式必須區分他的裝置發生了中斷還是共享線的其他裝置發出的中斷。
當執行乙個中斷處理程式時,核心處於中斷上下文。中斷上下文不可以被睡眠,不能從中斷上下文中呼叫某些函式。重要的一點是中斷上下文必須要盡可能迅速簡潔的完成工作。
中斷處理系統在linux中的實現非常依賴體系結構。上圖中,硬體產生乙個中斷的電訊號,中斷電訊號先經過中斷控制器,如果是未被遮蔽的,則繼續發往處理器,如果處理器未禁止該中斷,則處理器會立刻停止正在做的事,關閉中斷系統,通過do_irq()到記憶體中指定位置開始執行**。
linux中提供了一系列介面來控制中斷狀態:或禁止當預處理器的中斷系統,或遮蔽掉整個機器一條中斷線。這樣做的原因往往是需要提供同步,確保某個中斷處理程式不會搶占當前**。此外,還可以獲取某種鎖來防止來自其他處理器的併發訪問。
禁止和啟用中斷:用於禁止當預處理器上的本地中斷,隨後又啟用的語句:
但是操蛋的是如果之前已經禁止中斷,我們將不能再次禁止,或者無條件的啟用中斷。所以:
禁止指定中斷線:
前兩者禁止中斷線,第乙個等待處理程式執行完畢,而第二個不等待,第四個等待乙個特定的中斷處理程式的退出,第三個函式對前兩個函式禁止的中斷線進行啟用,是可巢狀的,如果前兩個函式呼叫了兩次,那麼第三個函式也必須在同一中斷線上呼叫兩次才能啟用這個中斷線。
中斷系統的狀態:linux提供了幾個藉口來檢查中斷系統的狀態:
python第七章 python教程(第七章)
字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...
《Redis設計與實現》之第七章 壓縮列表
壓縮列表是列表鍵和雜湊鍵的底層實現之一。壓縮列表是為了節約記憶體而開發的,是由一系列特殊編碼的連續記憶體塊組成的順序型資料結構。壓縮列表是一種資料結構,這種資料結構的功能是將一系列資料與其編碼資訊儲存在一塊連續的記憶體區域,這塊記憶體物理上是連續的,邏輯上被分為多個組成部分,其目的是在一定可控的時間...
《Redis設計與實現》之第七章 壓縮列表
壓縮列表是列表鍵和雜湊鍵的底層實現之一。壓縮列表是為了節約記憶體而開發的,是由一系列特殊編碼的連續記憶體塊組成的順序型資料結構。壓縮列表是一種資料結構,這種資料結構的功能是將一系列資料與其編碼資訊儲存在一塊連續的記憶體區域,這塊記憶體物理上是連續的,邏輯上被分為多個組成部分,其目的是在一定可控的時間...