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