前一陣子在ml上升級了內核
2.6內核的模塊無(wú)論是編寫(xiě)框架還是編譯方法都和2.4版有了很大不同,網(wǎng)絡(luò )上有很多關(guān)于這個(gè)問(wèn)題的文章,但是大多沒(méi)有對一些細節問(wèn)題說(shuō)清楚,導致了編譯hello world級的模塊都會(huì )出問(wèn)題,這對于剛剛開(kāi)始學(xué)習內核模塊編程的朋友來(lái)說(shuō)是非常不好的,下面我就來(lái)說(shuō)一下整個(gè)框架的編寫(xiě)和編譯方法,目的就是能夠作出一個(gè)可以看到結果模塊。
說(shuō)明
在你進(jìn)行任何具體的編程前,你應該看看你自己源代碼目錄樹(shù)中 Documentation / kbuild中的幾篇文章,對你編程大有益處的。當然如果你不愿意看,就湊合看我說(shuō)的吧。
使用模塊進(jìn)行編程最大的好處就是可以和內核有個(gè)親密接觸,對于所有的內核變量和CPU特權指令都可以在模塊中使用,這里的例子是根據<<Linux Device Driver 3nd Edition>> 中的helloworld改寫(xiě)的,功能包括current符號和%cr3寄存器的讀取,這些在Ring3下都是不可能的。
程序框架
代碼: |
#include <linux/init.h> |
編譯模塊
值得說(shuō)明的是,編譯模塊的make file的文件名必須是Makefile,而不能是makefile
Makefile的代碼
代碼: |
ifneq ($(KERNELRELEASE),) |
關(guān)于GNU make工具擴展的說(shuō)明
在上面的Makefile中使用了
obj-m := 這個(gè)賦值語(yǔ)句的含義說(shuō)明要使用目標文件helloworld.o建立一個(gè)模塊,最后生成的模塊的名字就是helloworld.ko,如果你有一個(gè)名為module.ko的模塊依賴(lài)于兩個(gè)文件file1.o和file2.o,那么我們可以使用module-obj擴展,如下所示
obj-m := module.o
module-objs := file1.o file2.o
編譯模塊
只要在helloword.c所在目錄執行make就好了,在編譯完成后,用root身份輸入/sbin/init 3
進(jìn)入text mode
測試
輸入 insmod ./helloworld.ko 應該能看到三行信息
輸入 rmmod ./helloworld.ko 看到goodbye...
聯(lián)系客服