首先,在主目录的package目录下创建一个模块目录mymodule:
$ mkdir mymodule
$ pwd
xxx/package/mymodule
注意到,在package目录下有一个button-hotplug模块,其结构非常轻便,本文后续描述的内容都是参照该模块完成的。
在mymodule目录下创建一个Makefile文件和一个src目录:
$ touch Makefile
$ mkdir src
$ ls
Makefile src
其中Makefile文件的内容为:
# # Copyright (C) 2008-2010 OpenWrt.org # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. # include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/kernel.mk PKG_NAME:=mymodule PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk define KernelPackage/mymodule SUBMENU:=Other modules TITLE:=My Test Module FILES:=$(PKG_BUILD_DIR)/mymodule.ko AUTOLOAD:=$(call AutoLoad,81,mymodule) KCONFIG:= endef define KernelPackage/mymodule/description Kernel module to do some test endef EXTRA_KCONFIG:= \ CONFIG_MYMODULE=m EXTRA_CFLAGS:= \ $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \ $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \ MAKE_OPTS:= \ ARCH="$(LINUX_KARCH)" \ CROSS_COMPILE="$(KERNEL_CROSS)" \ SUBDIRS="$(PKG_BUILD_DIR)" \ EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ $(EXTRA_KCONFIG) define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Compile $(MAKE) -C "$(LINUX_DIR)" \ $(MAKE_OPTS) \ modules endef $(eval $(call KernelPackage,mymodule))
其内容是在button-hotplug模块的Makefile文件基础上做了修改,以生成我们自己的测试模块。
src目录下的内容如下:
$ Kconfig Makefile mymodule.c
其中Kconfig:
config MYMODULE
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时加上了参数就能够成功执行模块了。
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。