第 31章 核心模組

Linux 核心是一種模組化的設計,在開機時只有一個最小的常駐核心會被載入到記憶體中。因此當使用者要求常駐核心中不存在的特色時,便會動態地載入一個 『核心模組』(有時候稱為一個 『驅動程式』)到記憶體中。

在安裝過程中,會偵測系統上的硬體,依據這次的偵測以及由使用者提供的資訊,安裝程式會決定那些模組需要在開機時載入。 安裝程式會設定一個動態的載入機制以方便運作。

假如在安裝完成後加入新的硬體,而該硬體需要一個核心模組,系統需要經過設定以為新的硬體載入適當的核心模組。 當含有新硬體的系統開機時,便會執行 Kudzu 程式來偵測新的硬體(假如有受支援的話),並且為其設定一個模組。 您也可以編輯 /etc/modules.conf 模組設定檔案來手動地指定模組。

注請注意
 

使用來顯示 X 視窗系統介面的顯示卡是 XFree86 套件的一部分,並不屬於核心,因此這個章節不適用它們。

舉例來說,假如一部系統含有一個 SMC EtherPower 10 PCI 網路介面卡,模組設定檔案將會包含以下這一行:

alias eth0 tulip

假如新增第二張網路卡到系統上,並且該卡與第一張卡相同,請新增以下這一行到 /etc/modules.conf 檔案中:

alias eth1 tulip

請參閱 Red Hat Linux 參考手冊 以找出以字母順序排列的核心模組清單,以及模組所支援的硬體。

31.1. 核心模組工具程式

假如有安裝 modutils 套件,您便可以使用一組用來管理核心模組的指令,請使用這些指令以決定模組是否被成功載入,或者當您為一個新的硬體測試不同的模組時。

/sbin/lsmod 指令將會顯示目前已經載入的模組清單,例如:

Module                  Size  Used by    Not tainted
iptable_filter          2412   0 (autoclean) (unused)
ip_tables              15864   1 [iptable_filter]
nfs                    84632   1 (autoclean)
lockd                  59536   1 (autoclean) [nfs]
sunrpc                 87452   1 (autoclean) [nfs lockd]
soundcore               7044   0 (autoclean)
ide-cd                 35836   0 (autoclean)
cdrom                  34144   0 (autoclean) [ide-cd]
parport_pc             19204   1 (autoclean)
lp                      9188   0 (autoclean)
parport                39072   1 (autoclean) [parport_pc lp]
autofs                 13692   0 (autoclean) (unused)
e100                   62148   1
microcode               5184   0 (autoclean)
keybdev                 2976   0 (unused)
mousedev                5656   1
hid                    22308   0 (unused)
input                   6208   0 [keybdev mousedev hid]
usb-uhci               27468   0 (unused)
usbcore                82752   1 [hid usb-uhci]
ext3                   91464   2
jbd                    56336   2 [ext3]

每一行中的第一個欄位是模組的名稱,第二個欄位是模組的大小,而第三個欄位是用量的記數。

最後一個欄位中的資訊對於每一個模組都有些許不同。 假如模組的該欄位列出 (unused),表示該模組目前並不在使用中。 如果是 (autoclean),表示該模組可以由 rmmod -a 指令自動清理(autocleaned),在執行這個指令後,任何被標示為 autoclean 的模組將會被卸載(如果從上一次 autoclean 的動作後都沒有被使用)。 Red Hat Linux 並不預設執行這個 autoclean 的動作。

假如在一行的最後列出一個以括號括住的模組名稱,該模組是依附於該行第一個欄位中所列出的模組。 舉例來說:

usbcore                82752   1 [hid usb-uhci]

hid 與 usb-uhci 核心模組是依附於 usbcore 模組。

/sbin/lsmod 指令的輸出與檢視 /proc/modules 檔案的內容是相同的。

如要載入一個核心模組,請使用 /sbin/modprobe 指令再加上核心模組的名稱。 預設情況下,modprobe 會試著從 /lib/modules/<核心版本>/kernel/drivers/ 的子目錄載入模組,在其中每一種類型的模組都放置於一個子目錄中,如 net/ 子目錄會存放網路介面驅動程式。 有些核心模組有模組相依性的情況,這表示必須先載入其他模組才能載入這個模組。 /sbin/modprobe 指令將會檢查這些相依性,並且於載入特定模組前先載入相依的模組。

舉例來說:

/sbin/modprobe hid

這個指令會載入任何的相依模組,然後再載入 hid 模組。

如要在螢幕上列出所有指令一如 /sbin/modprobe 執行它們,請使用 -v 選項,例如:

/sbin/modprobe -v hid

會顯示類似如下的輸出:

/sbin/insmod /lib/modules/2.4.20-2.47.1/kernel/drivers/usb/hid.o
Using /lib/modules/2.4.20-2.47.1/kernel/drivers/usb/hid.o
Symbol version prefix 'smp_'

/sbin/insmod 指令也可用來載入核心模組,然而它並不解決相依性的問題,因此還是建議您使用 /sbin/modprobe 指令。

如要卸載核心模組,請使用 /sbin/rmmod 指令再加上模組名稱。 rmmod 指令只能卸載不在使用中的模組,而且該模組並不依附於其他使用中的模組。

例如這個指令

/sbin/rmmod hid

將會卸載 hid 核心模組。

另一個好用的核心模組工具是 modinfo,請使用 /sbin/modinfo 指令來顯示關於一個核心模組的資訊,一般的語法是:

/sbin/modinfo [選項] <模組名稱>

包含 -d 選項將會秀出該模組的一個簡短的描述,而 -p 選項則會列出該模組所支援的參數。 如要取得完整的選項清單,請參考 modinfo 的 man page (man modinfo)。