- 核心模組 (kernel module) 的用途
既然核心檔案都已經包含了硬體偵測與驅動模組,那麼什麼是核心模組啊?要注意的是, 現在的硬體更新速度太快了,如果我的核心比較舊,但我換了新的硬體,那麼,這個核心肯定無法支援! 怎麼辦?重新拿一個新的核心來處理嗎?開玩笑~核心的編譯過程可是很麻煩的~
所以囉,為了這個緣故,我們的 Linux 很早之前就已經開始使用所謂的模組化設定了! 亦即是將一些不常用的類似驅動程式的咚咚獨立出核心,編譯成為模組,然後, 核心可以在系統正常運作的過程當中載入這個模組到核心的支援。如此一來, 我在不需要更動核心的前提之下,只要編譯出適當的核心模組,並且載入他,呵呵!我的 Linux 就可以使用這個硬體啦!簡單又方便!
那我的模組放在哪裡啊?可惡!怎麼會問這個傻問題呢?當然一定要知道的啦!就是/lib/modules/$(uname -r)/kernel/ 當中啦!
- 核心原始碼下的次目錄
在上述核心目錄下含有哪些重要資料呢?基本上有底下這些東西:
- arch :與硬體平台有關的項目,大部分指的是 CPU 的類別,例如 x86, x86_64, Xen 虛擬支援等;
- block :與區塊裝置較相關的設定資料,區塊資料通常指的是大量儲存媒體!還包括類似 ext3 等檔案系統的支援是否允許等。
- crypto :核心所支援的加密的技術,例如 md5 或者是 des 等等;
- Documentation :與核心有關的一堆說明文件,若對核心有極大的興趣,要瞧瞧這裡!
- drivers :一些硬體的驅動程式,例如顯示卡、網路卡、PCI 相關硬體等等;
- firmware :一些舊式硬體的微指令碼 (韌體) 資料;
- fs :核心所支援的 filesystems ,例如 vfat, reiserfs, nfs 等等;
- include :一些可讓其他程序呼叫的標頭 (header) 定義資料;
- init :一些核心初始化的定義功能,包括掛載與 init 程式的呼叫等;
- ipc :定義 Linux 作業系統內各程序的溝通;
- kernel :定義核心的程序、核心狀態、執行緒、程序的排程 (schedule)、程序的訊號 (signle) 等
- lib :一些函式庫;
- mm :與記憶體單元有關的各項資料,包括 swap 與虛擬記憶體等;
- net :與網路有關的各項協定資料,還有防火牆模組 (net/ipv4/netfilter/*) 等等;
- security :包括 selinux 等在內的安全性設定;
- sound :與音效有關的各項模組;
- virt :與虛擬化機器有關的資訊,目前核心支援的是 KVM (Kernel base Virtual Machine)
這些資料先大致有個印象即可,至少未來如果你想要使用 patch 的方法加入額外的新功能時, 你要將你的原始碼放置於何處?這裡就能夠提供一些指引了。當然,最好還是跑到 Documentation 那個目錄底下去瞧瞧正確的說明, 對你的核心編譯會更有幫助喔!
列出系統目前載入的核心模組: lsmod
插入核心模組: insmod
移除核心模組: rmmod
查詢核心模組的相依性: depmod
使用 insmod 與 rmmod 的問題就是,你必須要自行找到模組的完整檔名才行,而且如同上述範例二的結果, 萬一模組有相依屬性的問題時,你將無法直接載入或移除該模組呢!所以近年來我們都建議直接使用 modprobe 來處理模組載入的問題,這個指令的用法是:
[root@www ~]# modprobe [-lcfr] module_name 選項與參數: -c :列出目前系統所有的模組!(更詳細的代號對應表) -l :列出目前在 /lib/modules/`uname -r`/kernel 當中的所有模組完整檔名; -f :強制載入該模組; -r :類似 rmmod ,就是移除某個模組囉~ 範例一:載入 cifs 模組 [root@www ~]# modprobe cifs # 很方便吧!不需要知道完整的模組檔名,這是因為該完整檔名已經記錄到 # /lib/modules/`uname -r`/modules.dep 當中的緣故啊!如果要移除的話: [root@www ~]# modprobe -r cifs |
使用 modprobe 真的是要比 insmod 方便很多!因為他是直接去搜尋 modules.dep 的紀錄, 所以囉,當然可以克服模組的相依性問題,而且還不需要知道該模組的詳細路徑呢! 好方便! ^_^
Reference:
1. http://www.php5.idv.tw/documents/redhatTW/RHCG/ch-kernel-modules.html
沒有留言:
張貼留言