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可以启用新添加的内核模块。

  1. make menuconfig: 搜索demo将其选中然后保存退出
  2. 手动启用,修改.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的信息已经成功打印出来了!

相关文章链接:

  1. Openwrt中添加内核模块:https://www.litreily.top/2018/05/30/openwrt-ko/

  2. openwrt中添加自定义驱动模块:http://www.voidcn.com/article/p-mmvxgcek-or.html

  3. openwrt中添加自定义驱动模块和APP:http://www.voidcn.com/article/p-hnrilpho-bda.html

  4. openwrt Creating packages:https://openwrt.org/docs/guide-developer/packages

  5. 编译自己的openwrt:https://www.jianshu.com/p/2a9aa7d841a3

  6. OpenWrt下静态编译驱动到内核中的方法:https://blog.csdn.net/zhemingbuhao/article/details/82116078

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值