如果想要在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,在Othersmodule配置参数附近添加如下内容
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的信息已经成功打印出来了!
相关文章链接:
-
Openwrt中添加内核模块:https://www.litreily.top/2018/05/30/openwrt-ko/
-
openwrt中添加自定义驱动模块:http://www.voidcn.com/article/p-mmvxgcek-or.html
-
openwrt中添加自定义驱动模块和APP:http://www.voidcn.com/article/p-hnrilpho-bda.html
-
openwrt Creating packages:https://openwrt.org/docs/guide-developer/packages
-
编译自己的openwrt:https://www.jianshu.com/p/2a9aa7d841a3
-
OpenWrt下静态编译驱动到内核中的方法:https://blog.csdn.net/zhemingbuhao/article/details/82116078