Openwrt中添加内核模块
如果想要在Openwrt
系统中添加一个内核模块,其实并不难,对着某个已有的内核模块,依葫芦画瓢嘛,不难。本文将介绍一个最最简单的
sourcecode
path: git_repo/package/kmod-demo/
下面是源码包含的所有文件,根级Makefile
提供给内核编译器使用,src
级Makefile
用于编译.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
仿其它内核模块编写,注意替换名称demo
,SUBMENU
以及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)
改为y
或m
即可。
obj ?= .
obj-$(CONFIG_DEMO) += demo.o
更新 .config
使用make menuconfig
或者直接修改配置文件.config
可以启用新添加的内核模块。
make menuconfig
: 搜索demo
将其选中然后保存退出- 手动启用,修改
.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
的信息已经成功打印出来了!
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 litreily的博客!