Openwrt中添加内核模块

如果想要在Openwrt系统中添加一个内核模块,其实并不难,对着某个已有的内核模块,依葫芦画瓢嘛,不难。本文将介绍一个最最简单的

sourcecode

path: git_repo/package/kmod-demo/

下面是源码包含的所有文件,根级Makefile提供给内核编译器使用,srcMakefile用于编译.ko文件。

$ tree
.
├── Makefile
└── src
    ├── demo.c
    ├── Kconfig
    └── Makefile

demo.c

源码非常简单,在装载时打印Hello World,卸载时打印Exit

#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文件中添加一些编译相关的选项

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仿其它内核模块编写,注意替换名称demoSUBMENU以及TITLE将显示在make menuconfig的交互界面中。

#
# Copyright (C) 2006 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
# $Id: Makefile 6565 2007-03-14 13:42:21Z nbd $

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk

PKG_NAME:=demo
PKG_RELEASE:=1

PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define 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)" \
    modules
endef

define KernelPackage/demo/install
  $(INSTALL_DIR) $(1)/lib/network/
endef

$(eval $(call KernelPackage,demo))

src - Makefile

源码的Makefile很简单,其实只要一行就够了,其中CONFIG_<module_name>需要在后续.config文件中配置,或者直接将$(CONFIG_DEMO)改为ym即可。

obj ?= .

obj-$(CONFIG_DEMO) += demo.o

更新 .config

使用make menuconfig或者直接修改配置文件.config可以启用新添加的内核模块。

  1. make menuconfig: 搜索demo将其选中然后保存退出
  2. 手动启用,修改.config,在Others module配置参数附近添加如下内容
CONFIG_KERNEL_kmod_demo=y

make

当源码和配置选项都准备好后,便可以编译安装了,单独安装需要整个kernel已经编译过一次,以保证交叉编译工具链能够正常使用。

make package/kmod-demo/compile V=s
make package/kmod-demo/install V=s

insmod/rmmod

# insmod
$ insmod demo.ko
Hello World

# rmmod
$ rmmod demo.ko
Exit

look, printk的信息已经成功打印出来了!