Linux核心模組編譯

2021-07-04 22:05:19 字數 2125 閱讀 1558

data mining

linux核心模組是一種可被動態載入和解除安裝的可執行程式。通過核心模組可以擴充套件核心功能,核心模組通常用於裝置驅動、檔案系統等。如果沒有核心模組,需要向核心新增功能就需要自發**、重新編譯核心、安裝新核心等步驟。

核心空間中不止乙個程式試圖訪問驅動程式模組,導致乙個核心塊在沒有被呼叫完畢之前又被其他程式呼叫,這稱之炒**的重入。因此在設計驅動模組的資料結構時要考慮資料結構在多執行緒環境下不被其他執行緒破壞,對於共享的資料應該採取加鎖的方法保護。

應用程式使用虛擬記憶體,有乙個巨大的位址空間。而核心模組可以使用的內在非常小,所以編碼時要注意記憶體的分配和使用。

printk是核心提供的列印函式,向終端輸出列印資訊。printf是glibc提供的函式,linux核心函式是不能依賴於任何程式庫的。

#uname -a

檢視當前shell下執行的linux核心版本是多少

然後去網上

下乙個2.6.32-26版本的核心源**

或者更簡單的方法:

#apt-get install linux-source

如果當前執行的核心版本與你編譯鏈結的標頭檔案版本不一致,

載入核心模組時會遇到insmod: error inserting 'modulehello.o'  :-l invalid module format

這樣的錯誤

注意我剛裝上ubuntu10.04的時候,在/lib/modules/2.6.32-24-generic下沒有build資料夾,果斷「系統|系統管理|更新管理」更新系統,這時候就有了/lib/modules/2.6.32-27-generic/build/makefile,重啟看看grub介面上版本號是多少,再使用uname -a已經是27不是24了。

當然你也可以更換linux核心版本,讓你的linux核心版本去與你的linux原始檔版本保持一致。至於如何更換linux核心版本,請看我的另一篇部落格

2.編寫驅動程式的makefile檔案

在與驅動程式相同的目錄下編寫驅動程式的makefile檔案

執行該makefile檔案時將跑到 kerneldir下呼叫make,即/lib/modules/$(shell uname -r) /build下必須有乙個makefiule檔案。這裡$(shell uname -r) 就等價於2.6.32-26-generic。

網上也有人把kerneldir設定為/usr/src/linux-headers-2.6.32-26-generic。

pwd指定要編譯的驅動程式原始檔所在的目錄,$(shell pwd) 表示當前目錄

最終要生成的目標是modules

執行$make

3.載入模組

insmod和modeprobe都可以載入乙個核心模組。insmod核心模組的符號是否已經在核心中定義,modprobe會檢查,並且還檢查模組的依賴關係。

sudo insmod ./modulehello.ko

用dmesg命令可以看到模組已經成功載入dm

esg dmesg | tail -n 2 tail -n 2表示只看最後2行

也可以用lsmod|grep modulehello檢視剛才安裝的模組,顯示的就是.ko前面的名稱

cat /proc/devices | grep hello 檢視核心分配的主裝置號,這個裝置名稱是在程式中註冊裝置時使用的名稱,跟上面的模組名稱沒有必然聯絡。

4.載入後還可以解除安裝核心模組

suod rmmod modulehello

$dmesg | tail -n 1

Linux編譯核心模組

核心模組即驅動的編譯方式 1 本地編譯 2 交叉編譯 makefile主要寫法 本地編譯 obj m hello.o kdir lib modules shell uname r build pwd shell pwd all make c kdir m pwd modules clean rm o...

linux核心模組編譯

1 makefile編寫 ifneq kernelrelease obj m mytest.o mytest objs file1.o file2.o file3.o else kdir lib modules shell uname r build pwd shell pwd default ma...

Linux 核心 編譯模組

由於除錯核心或者由於分割槽大小限制,有時候核心元件不一定完全需要編進核心中。所以,在開發中經常將核心元件編譯成為模組,等到在恰當的時機載入。linux核心模組的編譯方法有兩種 1.放入linux核心原始碼中編譯。2.獨立編譯模組。首先需要了解kconfig和makefile的作用 kconfig 對...