linux內核模塊基礎

linux內核模塊基礎

1 什麼是內核模塊

       內核模塊是Linux內核向外部提供的一個插口,其全稱爲動態可加載內核模塊(Loadable Kernel Module,LKM),我們簡稱爲模塊。Linux內核之所以提供模塊機制,是因爲它本身是一個單內核(monolithic kernel)。單內核的最大優點是效率高,因爲所有的內容都集成在一起,但其缺點是可擴展性和可維護性相對較差,模塊機制就是爲了彌補這一缺陷。

       模塊是具有獨立功能的程序,它可以被單獨編譯,但不能獨立運行。它在運行時被鏈接到內核作爲內核的一部分在內核空間運行,這與運行在用戶空間的進程是不同的。模塊通常由一組函數和數據結構組成,用來實現一種文件系統、一個驅動程序或其他內核上層的功能。


2 linux模塊命令

       核心的功能就是用來控制系統硬件與相關程序的東西!核心可以使用"模塊"的方式來動態的加載與移除所需要的模塊!那麼該如何加載與卸載這些模塊呢?

       開機時即加載模塊的檔案在於:/etc/modprobe.conf,如果你有任何的新的驅動程序需要在開機的時候加載,寫入這個檔案就對了!核心的驅動程序寫在:/lib/modules/`uname–r`/kernel/drivers。

手動編譯一些驅動程序或者是 tarball 的套件時,得到了 *.ko 這個編譯成功的目標檔案。這樣就編譯完成了,接着下來就是將編譯好的模塊放置在覈心應該要放置的地方,

       核心的模塊放置目錄: /lib/modules/`uname –r`/kernel/

       核心的檔案格式模塊: /lib/modules/`uname –r`/kernel/fs

       核心的網絡卡驅動程序模塊: /lib/modules/`uname –r`/kernel/drivers/net

       因此,我們要把模塊給他直接 copy 到該目錄. 完成編譯之後,想要在開機的時候立即啓動這個模塊的對應,那麼就寫入/etc/modprobe.conf 當中.


modprobe

[root @test /root]# modprobe [-l |-c]

[root @test /root]# modprobe modules_name<==直接加載該模塊與其相依屬性的模塊

參數說明:

-l :列出目前系統所有的模塊 ( 在 /lib/modules/`uname -r`/kernel 底下 )

-c :列出目前系統所有的模塊!(更詳細的代號對應表)

範例:

[root @test /root]# modprobe ip_tables <==直接加載 ip_tables.ko 這個模塊

需要特別留意的是,模塊全部都擺在『 /lib/modules/`uname -r`/kernel 』這個目錄下,而且模塊的名稱都是以 *.ko 這個附檔名存在,但是在實際加載模塊的時候,只要寫入名稱.



       insmod  *.ko 安裝模塊

**************************************

insmod(install module):載入模塊 install loadable kernel module

語法:insmod [-fkmpsvxX][-o <模塊名稱>][模塊文件][符號名稱 = 符號值]

參數:

-f  不檢查目前kernel版本與模塊編譯時的kernel版本是否一致,強制將模塊載入。

-k  將模塊設置爲自動卸除。

-m  輸出模塊的載入信息。

-o   <模塊名稱>  指定模塊的名稱,可使用模塊文件的文件名。

-p  測試模塊是否能正確地載入kernel。

-s  將所有信息記錄在系統記錄文件中。

-v  執行時顯示詳細的信息。

使用說明:Linux有許多功能是通過模塊的方式,在需要時才載入kernel。如此可使kernel較爲精簡,進而提高效率,以及保有較大的彈性。這類可載入的模塊,通常是設備驅動程序。

       insmod命令主要用於在Linux 2.4內核之前加載Linux內核模塊命令。對於通過此命令加載的Linux內核模塊,系統不僅不會自動解決內核模塊之間的依賴關係,而且還要求將模塊路徑寫詳細。所以在Linux 2.6內核出現時,此命令已漸漸被遺忘。

       加載RAID1陣列級別模塊,如下所示:

[root@rhel5 boot]# insmod /lib/modules/2.6.18-8.el5/kernel/drivers/md/raid1.ko  

[root@rhel5 boot]# lsmod | grep raid1  

raid1                  25153  0

從以上顯示結果可知,RAID1模塊已加載成功。只是在使用insmod命令加載模塊時,需要使用絕對路徑方能加載,且加載時無法自動解決依賴關係。


擴展閱讀:insmod 和modprobe的區別

insmod 這個工具,和modprobe 有點類似,但功能上沒有modprobe 強,modprobe 在掛載模塊是不用指定模塊文件的路徑,也不用帶文件的後綴.o 或.ko ;而insmod 需要的是模塊的所在目錄的絕對路徑,並且一定要帶有模塊文件名後綴的(modulefile.o 或modulesfile.ko )

insmod 與 modprobe 都是載入 kernel module,不過一般差別於 modprobe 能夠處理 module 載入的相依賴問題。比方要載入 a module,但是 a module 要求系統先載入 b module 時,直接用 insmod 掛入通常都會出現錯誤訊息,不過 modprobe 倒是能夠知道先載入 b module  後才載入 a module,如此相依性就會滿足。不過 modprobe 並不是大神,不會厲害到知道 module 之間的相依性爲何,該程式是讀取 /lib/modules/2.6.xx/modules.dep 檔案得知相依性的。而該檔案是透過 depmod 程式所建立。

**************************************        

       rmmod  *.ko  卸載模塊

       lsmod :列出目前系統中已加載的模塊的名稱及大小等;另外我們還可以查看 /proc/modules ,一樣可以知道系統已經加載的模塊。

       modinfo 可以查看模塊的信息,通過查看模塊信息來判定這個模塊的用途。

       modprobe 掛載新模塊以及新模塊相依賴的模塊

  modprobe 我們常用的功能就是掛載模塊,在掛載某個內核模塊的同時,這個模塊所依賴的模塊也被同時掛載;當然modprobe 也有列出內核所有模塊,還有移除模塊的功能;

       modprobe -l 是列出內核中所有的模塊,包括已掛載和未掛載的;通過modprobe -l ,我們能查看到我們所需要的模塊,然後根據我們的需要來掛載;其實modprobe -l 讀取的模塊列表就位於 /lib/modules/'uname -r' 目錄中;其中uname -r 是內核的版本;

  注意: 模塊名是不能帶有後綴的,我們通過modprobe -l 所看到的模塊,都是帶有.ko 或.o後綴;

       depmod 創建模塊依賴關係的列表

這個模塊管理工具是創建模塊依賴關係的列表,有幾個參數我們注意一下就行了,目前的的Linux 發行版所用的內核是2.6x版本,是自動解決依賴關係,所以這個命令知道就行了;模塊之前也有依賴關係,比如我們想驅動USB 移動硬盤,目前有兩種驅動,一種是udev ,在內核中有,但目前不太穩定;另一種辦法是用usb-storage驅動,而usb-storage 依賴的模塊是scsi 模塊,所以我們要用usb-storage 的模塊,也得把scsi 編譯安裝;

       再舉個例子:sata的硬盤,在Linux中的設備表示的是/dev/sd* ,比如 /dev/sda,/dev/sdb 等... 系統要驅動 sata硬盤,則需要把sata在內核中選中,或編譯成模塊,或內置於內核之中,在此同時,還需要在內核中選中ide ,scsi 的支持等;

       depmod 工具的洋文原意:depmod — program to generate modules.dep and map files.(我譯的:爲modules.dep 文件或映射文件創建依賴關係)

       [root@localhost beinan]# depmod -a 注:爲所有列在/etc/modprobe.conf 或/etc/modules.conf 中的所有模塊創建依賴關係,並且寫入到modules.dep文件;

       [root@localhost beinan]# depmod -e 注:列出已掛載但不可用的模塊;

       [root@localhost beinan]# depmod -n 注:列出所有模塊的依賴關係,但僅僅是輸出出來 (Write the dependency file on stdout only)

       注:modules.dep 位於 /lib/modules/內核版本 目錄



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章