OpenWrt下增加内核模块

    首先,在主目录的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时加上了参数就能够成功执行模块了。


本文章由作者:佐须之男 整理编辑,原文地址: OpenWrt下增加内核模块
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐