1. 程式人生 > >【Linxu核心設計與實現】-第7章 中斷和中斷處理

【Linxu核心設計與實現】-第7章 中斷和中斷處理

第7章 中斷和中斷處理

作業系統的核心任務之一-對連線上的硬體進行管理(硬碟、鍵盤、滑鼠等)。要想管理這些硬體,就需要可以和他們進行通訊。硬體的反應要遠遠慢於CPU,輪詢會耗費大量CPU資源,顯然不適合,那就是通過中斷機制來實現。

7.1 中斷

(1)中斷本質上是一種特殊的電訊號。由硬體裝置發向處理器。

(2)中斷隨時可產生,核心隨時可能被到來的中斷所打斷。

(3)每個中斷都有唯一的數字標識,作業系統得以對中斷進行區分。

(4)硬體發出的中斷是為了引起核心的關注,“嗨,我有新的按鍵需要處理,讀取並處理這些操作把”。

(5)異常:異常與中斷不同,異常產生時必須與處理器時鐘同步。異常也常常稱為同步中斷。

(6)系統呼叫是一種異常,來進入核心。

(7)中斷是由硬體引起的,而不是軟體。

7.2 中斷處理程式

(1)在響應一箇中斷的時候,核心會執行中斷處理程式,或者稱為中斷服務程式。

(2)產生中斷的每個裝置都有一個相應的中斷處理程式。

(3)一個裝置的中斷處理程式,是它裝置驅動程式的一部分。裝置驅動程式是用於對裝置管理的核心程式碼。

(4)Linux中,裝置驅動程式是C函式而已,只是需要按照特定的型別宣告。

(5)中斷處理程式是被核心呼叫來響應中斷的,運行於中斷上下文的特殊上下文中(該上下文程式碼不可被阻塞)。

(6)中斷隨時發生,中斷服務程式隨時可能被執行,因此需要保證中斷處理程式可以快速執行。

(7)中斷服務程式需要告訴硬體,我聽到你了,現在回去工作吧。即需要對硬體應答,同時可能需要進行資料拷貝等操作。如網路裝置中斷。

7.3 上半部與下半部對比

(1)中斷處理為了執行快,而且可執行的內容多,因此被分為上半部和下半部

(2)

  • 上半部:中斷處理程式,接收一箇中斷,它就立刻開始執行,只做有嚴格時限的工作,例如對接受的中斷進行硬體應答或者復位硬體。
  • 下半部:允許稍後完成的工作。Linux提供了實現下半部的各種機制。

(3)網絡卡例子

上半部:

       網絡卡發出中斷:hi核心,我有資料來了。核心執行網絡卡中斷處理程式來做出應答。拷貝最新網路資料包到記憶體中,因為網絡卡快取有限,不及時拷貝,資料可能丟失,拷貝後上半部分完成。

下半部:

       處理和操作資料包。

7.4 註冊中斷處理程式

(1)中斷處理程式是驅動程式的組成部分。驅動程式可以通過request_irq()函式註冊一箇中斷處理程式。並且啟用給定的中斷線,以處理中斷。

(2)request_irq()在<linux/interrupt.h>中

int request_irq(unsignedint irq,irq_handler_t handler,unsigned long flags,const char * name,void *dev)
引數解析:
  • 第一個引數irq:

要分配的中斷號。

  • 第二個引數handler:

是一個指標,指向處理這個中斷的中斷處理程式。只有作業系統一接受到中斷,這個函式就會被呼叫。

7.4.1 中斷處理程式標誌

  • 第三個引數flags:

可以是0,也可以是一個或多個標誌的位掩碼<linux/interrupt.h>。


  • 第四個引數name:

與中斷相關的裝置的ASCII文字表示,這些名字會被/proc/irq和/proc/interrupts檔案使用,以便與使用者通訊。

  • 第五個引數dev:

用於共享中短線,如果無需共享中斷線,那麼該引數設定成NULL即可。當中斷處理程式需要釋放的時候,dev將提供唯一的標識資訊(cookie),以便從共享中斷線諸多中斷處理程式中刪除指定的哪一個。

  • 返回值:

執行成功返回:0。非零則失敗。

注意:

request_irq()函式可能休眠,不能在中斷上下文或其他不允許阻塞的程式碼中呼叫,由於kmalloc()可能休眠。

7.4.2 一箇中斷例子


7.4.3 釋放中斷處理程式

(1)解除安裝驅動的時候,需要登出相應的中斷線。呼叫

Void free_irq(unsigned int irq , void *dev)
(2)如果中斷線不是共享的,該函式刪除處理程式的同時,將禁用這條中斷線。如果是共享的,則僅刪除dev對應的處理程式,中斷線只有在刪除了最後一個處理程式時才被禁止。


7.5 編寫中斷處理程式

中斷處理程式函式宣告

static irqreturn_t intr_handler(int irq,void *dev)
  • 引數irq:中斷號
  • 引數dev:通用指標,與傳遞給request_irq()的dev一致。可以用來區分共享同一中斷處理程式的多個裝置。
  • 返回值irqreturn_t:實際為一個int。中斷處理程式被正常呼叫,且確實是它所對應裝置產生中斷時返回IRQ_HANDLER。

7.6 中斷上下文

(1)當執行一箇中斷處理程式時,核心處於中斷上下文中。

(2)中斷上下文不可以休眠,具有較為嚴格的時間限制。

(3)回憶:程序上下文是一種核心所處的操作模式,此時核心代表程序執行,如執行系統呼叫或者執行核心執行緒,程序上下文可以休眠,也可以呼叫排程程式。

(4)中斷處理程式儘可能的迅速,簡潔,儘可能把工作從中斷處理程式中獨立出來,放在下半部執行,因為下半部可以在更適合的時間執行。

7.7 中斷處理機制的實現(待深入)

(1)中斷處理系統在Linux中的實現非常依賴於體系結構

7.8 /proc/interrupts

(1)procfs是一個虛擬檔案系統,只存在於核心記憶體中,一般安裝與/proc目錄。

(2)/proc/interrupts中存放了系統中與中斷相關的統計資訊。

7.9 中斷控制


7.9.1 禁止和啟用中斷

(1)用於禁止和啟用當前處理器上的本地中斷。

7.9.2 禁止指定中斷線

(1)僅禁止整個系統中的某一條中斷線。

7.9.3 中斷系統的狀態

(1)獲取中斷系統的狀態(禁止or啟用),是否處於中斷上下文的執行狀態。

(2)中斷控制方法列表


7.10 小結

中斷是一種由裝置使用的硬體資源非同步的向處理器發訊號,中斷就是由硬體來打斷作業系統。


相關推薦

Linxu核心設計實現-7 中斷中斷處理

第7章 中斷和中斷處理 作業系統的核心任務之一-對連線上的硬體進行管理(硬碟、鍵盤、滑鼠等)。要想管理這些硬體,就需要可以和他們進行通訊。硬體的反應要遠遠慢於CPU,輪詢會耗費大量CPU資源,顯然不

Redis設計實現3 連結串列

開發十年,就只剩下這套架構體系了! >>>   

Redis設計實現2 簡單動態字串

開發十年,就只剩下這套架構體系了! >>>   

Android UI設計開發06期:底部選單欄(一)使用TabActivity實現底部選單欄

轉載請註明出處:http://blog.csdn.net/yangyu20121224/article/details/8989063               從這一篇文章開始,我們將進入到一個應用程式主介面UI的開發和設計中了,底部選單欄在Android的應用開發當

Redis 設計實現) -- 整數集合(intset)

相同 spa edi redis cnblogs 保存 空間 數值 一個數 概述 1.intset概述 2.intset實現 3.intset升級 intset概述 整數集合是Redis集合鍵的底層實現之一,當值都為整數時,redis就會選擇整數集合作為底層實現。 可以保

Redis 設計實現) -- 數據庫

resize ger think contex sta 占用 return bsp null 概述 1.數據庫結構 2.數據庫鍵空間 3.鍵生存時間 4.持久化對過期鍵處理 5.數據庫通知 1.數據庫結構 Redis服務器將所有server狀態都保存在數據結構

Redis 設計實現) -- 持久化RBD

key fork amount del pty str server int name 概述 Redis為內存數據庫,即所有的鍵值對信息保存在內存中,那麽一旦服務器出現問題重啟,內存中的數據就會沒有了。所以Redis需要實現持久化,將內存中的數據持久化到硬盤,在重新啟動後

Redis 設計實現) -- 持久化AOF

written led atom 我們 continue ctc unixtime 機制 warn 概述 Redis除了RDB方式提供持久化外,還提供了AOF的方式,和RDB保存數據庫的鍵值對不同,AOF是記錄數據庫執行的命令來記錄數據庫狀態的。當AOF開始時,Redis

Redis 設計實現十三) -- 客戶端

腳本 ons listening last then red logs 可能 reply 概述 對於每個與服務器連接的客戶端,服務器都為它創建相應的redisClient的數據結構,並保持了相應的狀態。Redis Server通過一個鏈表來保存所有的客戶端連接。 本章包括:

《redis設計實現》-5跳躍表

一 序:    之前的文章<跳躍表的原理> 已經整理過,本篇看下redis的具體實現。以下摘自書上的介紹:   跳躍表(skiplist)是一種有序資料結構, 它通過在每個節點中維持多個指向其他節點的指標, 從而達到快速訪問節點的目的。跳躍表支援平均 O(\l

《redis設計實現》-6整數集合intset

一 序   intset是Redis集合的底層實現之一,當儲存整數集合並且資料量較小的情況下Redis會使用intset作為set的底層實現。當資料量較大或者集合元素為字串時則會使用dict實現set。這一章看書相對簡單,看一下原始碼對應的api,發現自己對於位元組序不懂,

《Redis設計實現4 字典

    字典,又稱為符號表(symbol table)、關聯陣列(associative array)或對映(map),是一種用於儲存鍵值對(key-value pair)的抽象資料結構。    字典中的每個鍵都是獨一無二的,程式可以在字典中根據鍵查詢與之關聯的值,或者通過鍵

讀書筆記《Linux核心設計實現》程序管理程序排程

大學跟老師做嵌入式專案,寫過I2C的裝置驅動,但對Linux核心的瞭解也僅限於此。Android系統許多導致root的漏洞都是核心中的,研究起來很有趣,但看相關的分析文章總感覺隔著一層窗戶紙,不能完全理會。所以打算系統的學習一下Linux核心。買了兩本書《Linux核心設計與實現(第3版)》和《深入理解Lin

乾貨!!十分鐘帶你搞懂 Java AQS 核心設計實現!!!

前言 這篇文章寫完放著也蠻久的了,今天終於釋出了,對於拖延症患者來說也真是不容易~哈哈哈。 言歸正傳,其實吧。。我覺得對於大部分想了解 AQS 的朋友來說,明白 AQS 是個啥玩意兒以及為啥需要 AQS,其實是最重要的。就像我一開始去看 AQS 的時候,抱著程式碼就啃,看不懂就去網上搜。。但是網上文章千篇一律

Linux核心設計實現 總結筆記()系統呼叫

系統呼叫 核心提供了使用者程序和核心互動的介面,使得應用程式可以受限制的訪問硬體裝置。 提供這些介面主要是為了保證系統穩定可靠,避免應用程式恣意妄行。   一、核心通訊 系統呼叫在使用者空間程序和硬體裝置之間新增中間才能。作用有三: 為使用者空間提供一種硬體的抽象介面。無需理會物理

Linux核心設計實現 總結筆記(核心資料結構

核心資料結構 Linux核心實現了這些通用資料結構,而且提倡大家在開發時重用。 核心開發者應該儘可能地使用這些資料結構,而不要自作主張的山寨方法。 通用的資料結構有以下幾種:連結串列、佇列、對映和二叉樹   一、連結串列 1.1 單向連結串列和雙向連結串列   1.2 環形

Linux核心設計實現 原書3版中文版pdf

                下載地址:網盤下載內容簡介編輯《Linux核心設計與實現(原書第3版)》基於Linux 2.6.34核心詳細介紹了Linux核心系統,覆蓋了從核心核心系統的應用到核心設計與實現等各方面的內容。《Linux核心設計與實現(原書第3版)》主要內容包括:程序管理、程序排程、時間管理和

linux核心設計實現 —— 中斷中斷處理78

中斷和中斷處理 中斷的目的:讓處理器最快地響應外部硬體的請求。 中斷本質上是一種特殊的電訊號,由硬體裝置發向處理器,處理器反映到作業系統中,最後由作業系統處理這個中斷電訊號。 不同的裝置對應的中斷不同。每個中斷都通過一個唯一的數字標記,這個標記通常被稱為中

linux核心設計實現 —— 定時器時間管理(11

核心中的時間概念 硬體為核心提供了一個系統定時器用以計算流逝的時間。系統定時器是一種可程式設計硬體晶片,它能以固定頻率產生中斷。該頻率可以通過程式設計預定,稱作節拍率(tick rate)。該中斷就是所謂的定時器中斷,它所對應的中斷處理程式負責更新系統時間,也

Linux核心設計實現(1)--核心開發的特點

1. 核心程式設計時既不能訪問C庫也不能訪問標準的C標頭檔案        其中的原因有很多種。其一,C標準庫的很多函式實現都是基於核心實現的,這核心編譯的時候都還沒有核心,所以就不存在這些函式,這個就是先有雞還是先有蛋這個悖論。其二,其主主要的的