开门见山。
首先,在主目录的package目录下创建一个模块目录mymodule:
$ mkdir mymodule$ pwdxxx/package/mymodule
注意到,在package目录下有一个button-hotplug模块,其结构非常轻便,本文后续描述的内容都是参照该模块完成的。
在mymodule目录下创建一个Makefile文件和一个src目录:
$ touch Makefile$ mkdir src$ lsMakefile src
其中Makefile文件的内容为:
1 # 2 # Copyright (C) 2008-2010 OpenWrt.org 3 # 4 # This is free software, licensed under the GNU General Public License v2. 5 # See /LICENSE for more information. 6 # 7 8 include $(TOPDIR)/rules.mk 9 include $(INCLUDE_DIR)/kernel.mk 10 11 PKG_NAME:=mymodule 12 PKG_RELEASE:=1 13 14 include $(INCLUDE_DIR)/package.mk 15 16 define KernelPackage/mymodule 17 SUBMENU:=Other modules 18 TITLE:=My Test Module 19 FILES:=$(PKG_BUILD_DIR)/mymodule.ko 20 AUTOLOAD:=$(call AutoLoad,81,mymodule) 21 KCONFIG:= 22 endef 23 24 define KernelPackage/mymodule/description 25 Kernel module to do some test 26 endef 27 28 EXTRA_KCONFIG:= \ 29 CONFIG_MYMODULE=m 30 31 EXTRA_CFLAGS:= \ 32 $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ 33 $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ 34 35 MAKE_OPTS:= \ 36 ARCH="$(LINUX_KARCH)" \ 37 CROSS_COMPILE="$(KERNEL_CROSS)" \ 38 SUBDIRS="$(PKG_BUILD_DIR)" \ 39 EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ 40 $(EXTRA_KCONFIG) 41 42 define Build/Prepare 43 mkdir -p $(PKG_BUILD_DIR) 44 $(CP) ./src/* $(PKG_BUILD_DIR)/ 45 endef 46 47 define Build/Compile 48 $(MAKE) -C "$(LINUX_DIR)" \ 49 $(MAKE_OPTS) \ 50 modules 51 endef 52 53 $(eval $(call KernelPackage,mymodule))
其内容是在button-hotplug模块的Makefile文件基础上做了修改,以生成我们自己的测试模块。
src目录下的内容如下:
$ Kconfig Makefile mymodule.c
其中Kconfig:
1 config MYMODULE 2 tristate "My Module For Test"
Makefile:
obj-${CONFIG_MYMODULE} := mymodule.o
这两个文件的内容也是参考button-hotplug模块的对应内容生成的。
mymodule.c文件的内容就不贴了,网上有很多编写helloworld内核模块的文章,可以直接拿来做实验用。
上面的内容都完成后,回到主目录进行内核编译选项配置:
make menuconfig Kernel modules Other modules /*模块Makefile中的SUBMENU指定*/ kmod-mymodule /*设置为 M */
保存后退出。
编译我们的mymodule模块:
$ make package/mymodule/compile
生成的模块文件可在主目录下找到:
$ find ./ -name mymodule.ko./build_dir/ ... /linux/mymodule/mymodule.ko./build_dir/ ... /kmod-mymodule/lib/modules/2.6.36/mymodule.ko./staging_dir/ ... /lib/modules/2.6.36/mymodule.ko
我们使用 ./build_dir/ ... /linux/mymodule/mymodule.ko,上传到OpenWrt系统就可以通过insmod和rmmod命令来进行测试啦。
PS.
一开时我insmod mymodule.ko会报错:
insmod: can't insert 'mymodule.ko': Operation not permitted
但其实我已经是在root权限下执行了,google了一阵没有找到解答,突然想起我的module是带参数的,于是在insmod时加上了参数就能够成功执行模块了。
周末加班,终于系统学习了向往已久的OpenWrt环境下内核模块制作的方法,以后就可以在此基础上做些小东西玩玩了,蛮开心,棒棒哒!