1. 程式人生 > >鳥哥的Linux私房菜讀書筆記--核心與核心模組

鳥哥的Linux私房菜讀書筆記--核心與核心模組

核心與核心模組的位置

· 核心: /boot/vmlinuz 或 /boot/vmlinuz-version; · 核心解壓縮所需 RAM Disk: /boot/initramfs (/boot/initramfs-version); · 核心模組: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel; · 核心原始碼: /usr/src/linux 或 /usr/src/kernels/ (要安裝才會有,預設不安裝) 如果該核心被順利的載入系統當中了,那麼就會有幾個資訊紀錄下來: · 核心版本: /proc/version · 系統核心功能: /proc/sys/kernel/ 對於作業系統不支援的新硬體,進行如下操作: · 重新編譯核心,並加入最新的硬體驅動程式原始碼; · 將該硬體的驅動程式編譯成為模組,在開機時載入該模組

1、核心模組與相依性

核心模組放置在: /lib/modules/$(uname -r)/kernel中,其主要分成幾個目錄

arch :與硬體平臺有關的專案,例如 CPU 的等級等等;
crypto :核心所支援的加密的技術,例如 md5 或者是 des 等等;
drivers :一些硬體的驅動程式,例如顯示介面卡、網路卡、PCI 相關硬體等等;
fs :核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;
lib :一些函式庫;
net :與網路有關的各項協議資料,還有防火牆模組 (net/ipv4/netfilter/*) 等等;
sound :與音效有關的各項模組;

我們需要去檢查這些模組的主要資訊,然後定義出他們的相依性,Linux提供了一些模組相依性的解決方案,就是檢查 /lib/modules/$(uname -r)/moudules.dep這個檔案,其記錄了再核心支援的模組的各項相依性。建立方法如下

[email protected] ~]# depmod [-Ane]
選項與引數:
-A :不加任何引數時, depmod 會主動的去分析目前核心的模組,並且重新寫入
 /lib/modules/$(uname -r)/modules.dep 當中。若加入 -A 引數時,則 depmod
 會去搜尋比 modules.dep 內還要新的模組,如果真找到新模組,才會更新。
-n :不寫入 modules.dep ,而是將結果輸出到螢幕上(standard out);
-e :顯示出目前已載入的不可執行的模組名稱
範例一:若我做好一個網絡卡驅動程式,檔名為 a.ko,該如何更新核心相依性?
[
[email protected]
~]# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net [[email protected] ~]# depmod

2、核心模組的觀察

$ lsmod
顯示內容包括:模組名稱(module)
模組大小(size)
此時模組是否被其他模組使用(used by)

檢視模組的相關資訊

[email protected] ~]# modinfo [-adln] [module_name|filename]
選項與引數:
-a :僅列出作者名稱;
-d :僅列出該 modules 的說明 (description);
-l :僅列出授權 (license);
-n :僅列出該模組的詳細路徑。
範例一:由上個表格當中,請列出 drm 這個模組的相關資訊:
[[email protected] ~]# modinfo drm
filename: /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/gpu/drm/drm.ko
license: GPL and additional rights
description: DRM shared core routines
author: Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl
rhelversion: 7.1
srcversion: 66683E37FDD905C9FFD7931
depends: i2c-core
intree: Y
vermagic: 3.10.0-229.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: A6:2A:0E:1D:6A:6E:48:4E:9B:FD:73:68:AF:34:08:10:48:E5:35:E5
sig_hashalgo: sha256
parm: edid_fixup:Minimum number of valid EDID header bytes (0-8, default 6) (int)
.....(底下省略).....
# 可以看到這個模組的來源,以及該模組的簡易說明!

3、核心模組的載入與移除

建議使用modprobe指令來載入模組,因為modprobe會主動搜尋modules.dep的內容,西安克服模組的相依性,才決定載入哪些模組。insmod完全由使用者自行載入一個完整檔名的模組,並不會主動分析模組的相依性

[[email protected] ~]# insmod [/full/path/module_name] [parameters]
範例一:請嘗試載入 cifs.ko 這個『檔案系統』模組
[[email protected] ~]# insmod /lib/modules/$(uname -r)/kernel/fs/fat/fat.ko
[[email protected] ~]# lsmod | grep fat
fat 65913 0

insmod 立刻就將該模組載入囉~但是 insmod 後面接的模組必須要是完整的『檔名』

移除模組:

[[email protected] ~]# rmmod [-fw] module_name
選項與引數:
-f :強制將該模組移除掉,不論是否正被使用;
範例一:將剛剛載入的 fat 模組移除!
[[email protected] ~]# rmmod fat
範例二:請載入 vfat 這個『檔案系統』模組
[[email protected] ~]# insmod /lib/modules/$(uname -r)/kernel/fs/vfat/vfat.ko
insmod: ERROR: could not load module /lib/modules/3.10.0-229.el7.x86_64/kernel/fs/vfat/
vfat.ko: No such file or directory
# 無法載入 vfat 這個模組啊!傷腦筋!

使用 insmod 與 rmmod 的問題就是,你必須要自行找到模組的完整檔名才行,而且如同上述範例二的結果, 萬一模組有相依屬性的問題時,你將無法直接載入或移除該模組呢!所以近年來我們都建議直接使用 modprobe 來處理模組載入的問題,這個指令的用法是:

[[email protected] ~]# modprobe [-cfr] module_name
選項與引數:
-c :列出目前系統所有的模組!(更詳細的代號對應表)
-f :強制載入該模組;
-r :類似 rmmod ,就是移除某個模組囉~
範例一:載入 vfat 模組
[[email protected] ~]# modprobe vfat
# 很方便吧!不需要知道完整的模組檔名,這是因為該完整檔名已經記錄到
# /lib/modules/`uname -r`/modules.dep 當中的緣故啊!如果要移除的話:
[[email protected] ~]# modprobe -r vfat

例題:嘗試使用 modprobe 載入 cifs 這個模組,並且觀察該模組的相關模組是哪個? 答:我們使用 modprobe 來載入,再以 lsmod 來觀察與 grep 擷取關鍵詞看看:

[[email protected] ~]# modprobe cifs
[[email protected] ~]# lsmod | grep cifs
cifs 456500 0
dns_resolver 13140 1 cifs <==竟然還有使用到 dns_resolver 哩!
[[email protected] ~]# modprobe -r cifs <==測試完移除此模組