如果想要在Openwrt系统中添加一个内核模块,其实并不难,对着某个已有的内核模块,依葫芦画瓢嘛,不难。本文将介绍一个最最简单的
sourcecode path: git_repo/package/kmod-demo/
下面是源码包含的所有文件,根级Makefile提供给内核编译器使用,src级Makefile用于编译.ko文件。
1 2 3 4 5 6 7 $ tree . ├── Makefile └── src ├── demo.c ├── Kconfig └── Makefile
demo.c 源码非常简单,在装载时打印Hello World,卸载时打印Exit。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include <linux/module.h> #include <linux/kernel.h> static int __init hello_init (void ) { printk("Hello World\n" ); return 0 ; }static void __exit hello_exit (void ) { printk("Exit\n" ); } module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE("GPL" ); MODULE_AUTHOR("Guangtao.wu" );
Kconfig 在Kconfig文件中添加一些编译相关的选项
1 2 3 4 5 6 config DEMO tristate "This is a Module_DEMO" default n help This is a DEMO, for debugging kernel model. If unsure, say N.
default : 该选项的默认值
n 不编译
y 编译到内核,启动时自动加载
m 编译生成.ko模块,不自动加载,需使用insmod加载
Root - Makefile 根级Makefile仿其它内核模块编写,注意替换名称demo,SUBMENU以及TITLE将显示在make menuconfig的交互界面中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 include $(TOPDIR) /rules.mkinclude $(INCLUDE_DIR) /kernel.mk PKG_NAME:=demo PKG_RELEASE:=1 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR) /$(PKG_NAME) include $(INCLUDE_DIR) /package.mkdefine KernelPackage/demo SUBMENU:=Other modules TITLE:=kernel demo VERSION:=$(LINUX_VERSION) -$(BOARD) -$(PKG_RELEASE) FILES:= $(PKG_BUILD_DIR) /demo.$(LINUX_KMOD_SUFFIX) AUTOLOAD:=$(call AutoLoad,46,demo) endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR) endef define Build/Compile $(MAKE) -C "$(LINUX_DIR) " \ CROSS_COMPILE="$(TARGET_CROSS) " \ ARCH="$(LINUX_KARCH) " \ SUBDIRS="$(PKG_BUILD_DIR) " \ EXTRA_CFLAGS="$(BUILDFLAGS) " \ modulesendef define KernelPackage/demo/install $(INSTALL_DIR) $(1)/lib/network/endef $(eval $(call KernelPackage,demo) )
src - Makefile 源码的Makefile很简单,其实只要一行就够了,其中CONFIG_<module_name>需要在后续.config文件中配置,或者直接将$(CONFIG_DEMO)改为y或m即可。
1 2 3 obj ?= . obj-$(CONFIG_DEMO) += demo.o
更新 .config 使用make menuconfig或者直接修改配置文件.config可以启用新添加的内核模块。
make menuconfig: 搜索demo将其选中然后保存退出
手动启用,修改.config,在Others module配置参数附近添加如下内容
1 CONFIG_KERNEL_kmod_demo=y
make 当源码和配置选项都准备好后,便可以编译安装了,单独安装需要整个kernel已经编译过一次,以保证交叉编译工具链能够正常使用。
1 2 make package/kmod-demo/compile V=s make package/kmod-demo/install V=s
insmod/rmmod 1 2 3 4 5 6 7 $ insmod demo.ko Hello World $ rmmod demo.ko Exit
look, printk的信息已经成功打印出来了!