Linux設備驅動概述
1. 內核和驅動模塊
操作系統是通過各種驅動程序來駕馭硬件設備,它為用戶屏蔽了各種各樣的設備,驅動硬件是操作系統最基本的功能,并且提供統一的操作方式。正如我們查看屏幕上的文檔時,不用去管到底使用nVIDIA芯片,還是ATI芯片的顯示卡,只需知道輸入命令后,需要的文字就顯示在屏幕上。硬件驅動程序是操作系統最基本的組成部分,在Linux內核源程序中也占有較高的比例。
Linux內核中采用可加載的模塊化設計(LKMs ,Loadable Kernel Modules),一般情況下編譯的Linux內核是支持可插入式模塊的,也就是將最基本的核心代碼編譯在內核中,其它的代碼可以選擇是在內核中,或者編譯為內核的模塊文件。
如果需要某種功能,比如需要訪問一個NTFS分區,就加載相應的NTFS模塊。這種設計可以使內核文件不至于太大,但是又可以支持很多的功能,必要時動態地加載。這是一種跟微內核設計不太一樣,但卻是切實可行的內核設計方案。
我們常見的驅動程序就是作為內核模塊動態加載的,比如聲卡驅動和網卡驅動等,而Linux最基礎的驅動,如CPU、PCI總線、TCP/IP協議、APM(高級電源管理)、VFS等驅動程序則編譯在內核文件中。有時也把內核模塊就叫做驅動程序,只不過驅動的內容不一定是硬件罷了,比如ext3文件系統的驅動。
理解這一點很重要。因此,加載驅動時就是加載內核模塊。下面來看一下有關模塊的命令,在加載驅動程序要用到它們:lsmod、modprob、insmod、rmmod、modinfo。
lsmod 列出當前系統中加載的模塊,例如:
|
上面顯示了當前系統中加載的模塊,左邊數第一列是模塊名,第二列是該模塊大小,第三列則是該模塊使用的數量。
如果后面為unused,則表示該模塊當前沒在使用。如果后面有autoclean,則該模塊可以被rmmod -a命令自動清洗。rmmod -a命令會將目前有autoclean的模塊卸載,如果這時候某個模塊未被使用,則將該模塊標記為autoclean。如果在行尾的[ ]括號內有模塊名稱,則括號內的模塊就依賴于該模塊。例如:
|
其中ide-cd及sr_mod模塊就依賴于cdrom模塊。
系統的模塊文件保存在/lib/modules/2.4.XXX/kerne目錄中,根據分類分別在fs、net等子目錄中,他們的互相依存關系則保存在/lib/modules/2.4.XXX/modules.dep 文件中。
需要注意,該文件不僅寫入了模塊的依存關系,同時內核查找模塊也是在這個文件中,使用modprobe命令,可以智能插入模塊,它可以根據模塊間依存關系,以及/etc/modules.conf文件中的內容智能插入模塊。比如希望加載ide的光驅驅動,則可運行下面命令:
|
此時會發現,cdrom模塊也會自動插入。
insmod也是插入模塊的命令,但是它不會自動解決依存關系,所以一般加載內核模塊時使用的命令為modprobe。
rmmod可以刪除模塊,但是它只可以刪除沒有使用的模塊。
Modinfo用來查看模塊信息,如modinfo -d cdrom,在Red Hat Linux系統中,模塊的相關命令在modutils的RPM包中。