日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写可加载模块

發(fā)布時間:2024/9/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写可加载模块 小編覺得挺不錯的,現(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)容還不錯,歡迎將生活随笔推薦給好友。