生活随笔
收集整理的這篇文章主要介紹了
编写可加载模块
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
Linux 2.6中的模塊必須包含以下兩個(gè)接口:
module_init(your_init_func);//模塊初始化接口 ?module_exit(your_exit_func);//模塊卸載接口?
加載一個(gè)內(nèi)核模塊的命令是insmod,格式如下:
#insmod?modulename.ko?
卸載一個(gè)內(nèi)核模塊的命令是rmmod,格式如下:
#rmmod?modulename?
可加載模塊的源代碼可以放在內(nèi)核代碼樹中,也可以獨(dú)立于內(nèi)核代碼樹。如果是后一種情況,就需要為可加載模塊編寫makefile文件。可加載模塊的makefile文件最重要的就是配置如下幾個(gè)變量:
CC??=?arm-linux-gcc ?obj-m???:=?smodule.o ?KERNELDIR??=?/mnt/v/linux-2.6.33.4 ?
CC是編譯器,obj-m為需要編譯的目標(biāo)模塊,KERNELDIR為內(nèi)核路徑。注意在編寫可加載模塊前先要有一個(gè)內(nèi)核代碼目錄樹。KERNELDIR的內(nèi)核版本必須與運(yùn)行的內(nèi)核版本一致,否則編譯出的模塊往往無法加載。
例1.1? 最簡(jiǎn)單的內(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"); ?
模塊運(yùn)行在內(nèi)核態(tài),不能使用用戶態(tài)C庫函數(shù)中的printf函數(shù),而要使用printk函數(shù)打印調(diào)試信息。編寫一個(gè)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。運(yùn)行結(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)核版本號(hào)。如果要使用rmmod命令卸載內(nèi)核模塊,必須在/lib/modules目錄下的以內(nèi)核版本號(hào)為名稱的目錄下建立相應(yīng)的模塊文件。從上面的結(jié)果看出,第一次運(yùn)行rmmod smodule會(huì)失敗。在建立模塊文件后,再次運(yùn)行rmmod smodule會(huì)成功。
總結(jié)
以上是生活随笔為你收集整理的编写可加载模块的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。