生活随笔
收集整理的這篇文章主要介紹了
编写可加载模块
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Linux 2.6中的模塊必須包含以下兩個接口:
module_init(your_init_func);//模塊初始化接口 ?module_exit(your_exit_func);//模塊卸載接口?
加載一個內(nèi)核模塊的命令是insmod,格式如下:
#insmod?modulename.ko?
卸載一個內(nèi)核模塊的命令是rmmod,格式如下:
#rmmod?modulename?
可加載模塊的源代碼可以放在內(nèi)核代碼樹中,也可以獨立于內(nèi)核代碼樹。如果是后一種情況,就需要為可加載模塊編寫makefile文件。可加載模塊的makefile文件最重要的就是配置如下幾個變量:
CC??=?arm-linux-gcc ?obj-m???:=?smodule.o ?KERNELDIR??=?/mnt/v/linux-2.6.33.4 ?
CC是編譯器,obj-m為需要編譯的目標模塊,KERNELDIR為內(nèi)核路徑。注意在編寫可加載模塊前先要有一個內(nèi)核代碼目錄樹。KERNELDIR的內(nèi)核版本必須與運行的內(nèi)核版本一致,否則編譯出的模塊往往無法加載。
例1.1? 最簡單的內(nèi)核模塊
代碼見光盤\src\1drivermodel\1-1simple。核心代碼如下所示:
static?int?demo_module_init(void) ?{ ?????printk("demo_module_init\n"); ?????return?0; ?} ?static?void?demo_module_exit(void) ?{ ?????printk("demo_module_exit\n"); ?} ?module_init(demo_module_init); ?module_exit(demo_module_exit); ??MODULE_DESCRIPTION("simple?module"); ?MODULE_LICENSE("GPL"); ?
模塊運行在內(nèi)核態(tài),不能使用用戶態(tài)C庫函數(shù)中的printf函數(shù),而要使用printk函數(shù)打印調(diào)試信息。編寫一個makefile文件如下:
AR??=?ar?ARCH????=?arm?CC??=?arm-linux-gcc ?DEBFLAGS?=?-O2 ?obj-m???:=?smodule.o ?KERNELDIR??=?/mnt/v/urbetter-linux2.6.28-v1.0 ?PWD???????:=?$(shell?pwd) ?modules: ?????$(MAKE)?-C?$(KERNELDIR)?M=$(PWD)?LDDINC=$(PWD)/../include?modules ?clean: ?????rm?-rf?*.o?*~?core?.depend?.*.cmd?*.ko?*.mod.c?.tmp_versions ?
執(zhí)行make后生成smodule.ko。運行結(jié)果如下:
[root@urbetter?/home]#insmod??smodule.ko? ?demo_module_init ?[root@urbetter?/home]#rmmod?smodule???? ?rmmod:?chdir(2.6.28.6):?No?such?file?or?directory ?[root@urbetter?/home]#mkdir?-p?/lib/modules/`uname?-r` ?[root@urbetter?/home]#cp?smodule.ko?/lib/modules/`uname?-r`/smodule.ko ?[root@urbetter?/home]#rmmod?smodule ?demo_module_exit ?
其中uname -r用來得到內(nèi)核版本號。如果要使用rmmod命令卸載內(nèi)核模塊,必須在/lib/modules目錄下的以內(nèi)核版本號為名稱的目錄下建立相應(yīng)的模塊文件。從上面的結(jié)果看出,第一次運行rmmod smodule會失敗。在建立模塊文件后,再次運行rmmod smodule會成功。
總結(jié)
以上是生活随笔為你收集整理的编写可加载模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。