Linux裝置驅動

來源:互聯網
上載者:User

一. 簡介

    作業系統是通過各種驅動程式來駕馭硬體裝置,它為使用者屏蔽了各種各樣的裝置,驅動硬體是作業系統最基本的功能,並且提供統一的操作方式。正如我們查看螢幕
上的文檔時,不用去管到底使用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檔案系統的驅
動。
    因此,載入驅動時就是載入核心模組。

    有關模組的命令有:lsmod、modprob、insmod、rmmod、modinfo

   
lsmod 列出當前系統中載入的模組
    rmmod卸載已載入的模組
    insmod,插入模組,但是它不會自動解決依存關係,所以一般載入核心模組時使用的命令為modprobe。

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

    modinfo,查看模組資訊

   
系統的模組檔案儲存在/lib/modules/2.4.XXX/kerne目錄中,根據分類分別在fs、net等子目錄中,他們的互相依存關係則儲存在/lib/modules/2.4.XXX/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目錄下的檔案,並返回結果。

參考:
    http://www.linuxfocus.org/ChineseGB/November2002/article264.shtml

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.