linux裝置驅動

2021-04-07 02:10:09 字數 3500 閱讀 6487

總結 linux核心的記憶體管理. 程序管理. 檔案管理. 裝置管理. 中斷等內容

linux裝置驅動

一. 簡介

作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本的組成部分,在linux核心源程式中也占有較高的比例。

二. 基本原理

裝置由兩部分組成,乙個是被稱為控制器的電器部分,另乙個是機械部分。控制器通過系統匯流排載入到 電腦上。典型的方式是,一組互不衝突的暫存器組被賦予到各個控制器。i/o埠包含4組暫存器,即狀態暫存器,控制暫存器,資料輸入暫存器,資料輸出暫存器。狀態暫存器擁有可以被主機讀取的(狀態)位,用來 指示當前命令是否執行完畢,或者位元組是否可以被讀出或寫入,以及任何錯誤提示。控制暫存器則被主機寫 操作以啟動一條命令或者改變裝置的(工作)模式。資料輸入暫存器用於獲取輸入而資料輸出暫存器則向主機 傳送結果。所以,處理器和裝置之間的基本介面是控制和狀態暫存器。當處理器執行程式並且遇到與裝置相關的指令 時,它通過向相應的裝置傳送一條命令來執行該指令。控制器執行所要求的動作並設定狀態暫存器的特定位, 然後進入等待。處理器有責任檢查裝置的狀態直到發現操作完成。例如並口驅動程式(印表機使用的)一般會 輪詢印表機以知道印表機是否準備好。如果印表機沒有準備好,驅動程式會睡眠一段時間(處理器此時會做其 他有用的工作),該過程將重複直到印表機準備好。這種輪詢的機制能夠改進系統的效能。另外一種方式則是 系統進行不必要的"死等"(unnecessarily waiting)而不做任何有用的工作。

暫存器擁有在i/o空間明確定義的位址範圍。通常這些位址在啟動時被分配,使用一組在配置檔案中定義 的引數。如果裝置是靜態載入的,各個裝置的位址範圍可能被預分配。這意味核心包含了已存在裝置的驅動 程式,已分配的i/o埠能被存放在proc目錄下。你可以在系統使用這些裝置時,通過執行「cat /proc/ioports」 命令同步的檢查其所使用的位址範圍。第一列輸出顯示了埠的範圍而第二列則是擁用這些埠的裝置。一些作業系統具備在執行時動態載入裝置驅動模組的特性。所以任何新的裝置都能通過動態載入模組在系統執行 時載入到系統中,並且能夠被控制和訪問。

裝置驅動的概念是非常抽象的並且處於一台計算上所執行軟體的最低層。由於直接到裝置的硬體特性的限 制。每個裝置驅動都只管理一種單一型別的裝置。這些型別可能是字元型,快裝置型或網路型。如果乙個應用 程式向裝置提出(操作)要求。核心會聯絡到對應的裝置驅動,裝置驅動接著向特定的裝置發出命令。裝置驅 動是乙個函式集合:包含了許多呼叫入口,類似於open,close,read,write,ioctl,llseek 等。當你插入 你的模組時,init_module ( ) 函式會被呼叫,而模組被移出時,cleanup_module ( ) 函式會被呼叫。裝置是在 裝置驅動的init_module ( ) 例程中被登記的。

當裝置在 init_module ( ) 中登記時,裝置的資源如i/o埠,記憶體和中斷號也在這個函式被分配,這也 是驅動程式能夠正確操作裝置的需要。如果你分配了任何錯誤的記憶體位址,系統會顯示錯誤資訊segmentation fault。 而對於i/o埠,系統不會給出任何類似wrong i/o port的資訊,但是指派任何現有裝置已使用的端 口將會造成系統崩潰。當你移出模組時,裝置應當被登出,更確切的說,主(裝置)號和資源將在cleanup_module ( ) 函式中被釋放.

裝置驅動最頻繁的工作時讀寫io埠。所以你的驅動應當是確信完美的,被裝置使用的埠位址是獨佔的。 任何其他裝置都不會使用這段位址範圍。為了確認這點,首先驅動應當查明這段位址是否在使用,當驅動發現 這段位址未被使用時,可以申請核心為裝置分配這段位址。

三. 核心與驅動模組

linux核心中採用可載入的模組化設計(lkms ,loadable kernel modules),一般情況下編譯的linux核心是支援可插入式模組的,也就是將最基本的核心**編譯在核心中,其它的**可以選擇是在核心中,或者編譯為核心的模組檔案。

我們常見的驅動程式就是作為核心模組動態載入的,比如音效卡驅動和網絡卡驅動等,而linux最基礎的驅動,如cpu、pci匯流排、tcp/ip協議、apm (高階電源管理)、vfs等驅動程式則編譯在核心檔案中。有時也把核心模組就叫做驅動程式,只不過驅動的內容不一定是硬體罷了,比如ext3檔案系統的驅動。

因此,載入驅動時就是載入核心模組。

有關模組的命令有:

l**od、modprob、in**od、rmmod、modinfo

l**od 列出當前系統中載入的模組

rmmod解除安裝已載入的模組

in**od

,插入模組,但是它不會自動解決依存關係,所以一般載入核心模組時使用的命令為modprobe。

modprobe,智慧型插入模組,即根據模組間依存關係,以及/etc/modules.conf檔案中的內容智慧型插入模組

modinfo,檢視模組資訊

系統的模組檔案儲存在/lib/modules/2.4.***/kerne目錄中,根據分類分別在fs、net等子目錄中,他們的互相依存關係則儲存在/lib/modules/2.4.***/modules.dep 檔案中

四. 裝置檔案

當載入了裝置驅動模組後,應該怎樣訪問這些裝置呢?linux是一種類unix系統,unix的乙個基本特點是「一切皆為檔案」,它抽象了裝置的處理,將所有的硬體裝置都像普通檔案一樣看待,也就是說硬體可以跟普通檔案一樣來開啟、關閉和讀寫。

系統中的裝置都用乙個裝置特殊檔案代表,叫做裝置檔案,裝置檔案又分為block(塊)型裝置檔案、character(字元)型裝置檔案和socket (網路外掛程式)型裝置檔案。block裝置檔案常常指定哪些需要以塊(如512位元組)的方式寫入的裝置,比如ide硬碟、scsi硬碟、光碟機等。 而character型裝置檔案常指定直接讀寫,沒有緩衝區的裝置,比如並口、虛擬控制台等。socket(網路外掛程式)型裝置檔案指定的是網路裝置訪問的bsd socket 介面。

裝置檔案都放在/dev目錄下

五.

使用/proc目錄中的檔案監視驅動程式的狀態

通過裝置檔案怎樣訪問到相應的驅動程式呢?它們中間有乙個橋梁,那就是proc檔案系統,它一般會被載入到/proc目錄。訪問裝置檔案時,作業系統通常會通過查詢/proc目錄下的值,確定由哪些驅動模組來完成任務。如果proc檔案系統沒有載入,訪問裝置檔案時就會出現錯誤。

linux系統中proc檔案系統是核心虛擬的檔案系統,其中所有的檔案都是核心中虛擬出來的,各種檔案實際上是當前核心在記憶體中的引數。它就像是專門為訪問核心而開啟的一扇門,比如訪問/proc/cpuinfo檔案,實際上就是訪問目前的cpu的引數,每一次系統啟動時系統都會通過 /etc/fstab中設定的資訊自動將proc檔案系統載入到/proc目錄下.

通過/proc目錄下的檔案可以訪問或更改核心引數,可以通過/proc目錄查詢驅動程式的資訊。

/proc/sys目錄下的檔案一般可以直接更改,相當於直接更改核心的執行引數,

free

等命令一般都是查詢/proc目錄下的檔案,並返回結果。

參考:

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

Linux裝置驅動

一.簡介 作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者遮蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們檢視螢幕上的文件時,不用去管到底使用nvidia晶元,還是ati晶元的顯示卡,只需知道輸入命令後,需要的文字就顯示在螢幕上。硬體驅動程式是作業系統最基本...

linux裝置驅動

1 flash的程式設計原理都是只能將1寫為0,而不能將0寫為1。所以在flash程式設計之前,必須將對應的塊擦除,而擦除的過程就是把所有位都寫為1的過程,塊內的所有位元組變為0xff。2 nand flash與nor flash相比容量大 低 nand flash中每個塊的最大擦寫次數是100萬次...