OpenWrt添加内核模块软件包(二)

本文参考
https://wiki.openwrt.org/zh-cn/doc/devel/packages
http://blog.chinaunix.net/uid-9217288-id-3060464.html

前面介绍了openwrt添加用户态软件包的方法,现在来说说添加内核模块软件包的方法。

相关介绍

内核模块是一类扩展Linux内核功能的可安装程序。内核模块的加载发生在内核加载之后,(比如使用insmod命令)。

Linux源代码包含了很多内核应用程序。在menuconfig时有3种选择,
1.编译进内核;
2.编译成可加载的内核模块;
3.不编译。

要包含这些内核模块,只要make menuconfig选择相应的内核模块选项。如果在make menuconfig时没有发现想要的内核模块,必须添加一个stanza到package/kernel/modules目录的一个文件中。下面是一个从package/kernel/modules/other.mk提取出来的例子。

define KernelPackage/loop
  TITLE:=Loopback device support
  DESCRIPTION:=Kernel module for loopback device support
  KCONFIG:=$(CONFIG_BLK_DEV_LOOP)
  SUBMENU:=$(EMENU)
  AUTOLOAD:=$(call AutoLoad,30,loop)
  FILES:=$(MODULES_DIR)/kernel/drivers/block/loop.$(LINUX_KMOD_SUFFIX)
endef
$(eval $(call KernelPackage,loop))

此外,你还可以添加不属于Linux源码包的内核模块。在这种情况下,内核模块放在package/目录,跟通常的软件包是一样的。package/Makefile文件使用KernelPackage/xxx定义代替Package/xxx。

接下来没就来简单说一下添加不属于linux源码包的内核模块的添加。

  1. 创建模块目录
cd openwrt/package
mkdir example

2.进入example目录,创建Makefile文件和代码路径

cd example
touch Makefile
mkdir src

Makefile具体内容如下:(具体参数说明请看之前的文章)

#
# Copyright (C) 2008 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:=example
PKG_RELEASE:=1

include $(INCLUDE_DIR)/package.mk

define KernelPackage/example
  SUBMENU:=Other modules
  TITLE:=example driver
  DEPENDS:=@LINUX_2_6
  FILES:=$(PKG_BUILD_DIR)/*.$(LINUX_KMOD_SUFFIX)
  KCONFIG:=
endef

define KernelPackage/example/description
  Kernel module to example
endef

EXTRA_KCONFIG:= \
    CONFIG_EXAMPLE=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="$(TARGET_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,example))

3.进入src目录,创建代码路径和相关源文件

cd src
touch example.c Makefile

example.c具体内容如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
/* hello_init ---- 初始化函数,当模块装载时被调用,如果成功装载返回0 否则返回非0值 */
static int __init hello_init(void)
{
    printk("I bear a charmed life.\n");
    return 0;
}
/* hello_exit ---- 退出函数,当模块卸载时被调用 */
static void __exit hello_exit(void)
{
    printk("Out, out, brief candle\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

Makefile具体内如如下:

obj-$(CONFIG_EXAMPLE)  += example.o

回到主路径 backfire/,编译选项配置保存并编译

make menuconfig
  Kernel modules --->
    Other modules --->
      kmod-example

选项设置为M,保存退出
然后编译该模块:

make package/example/compile

最后找到我们需要的.ko文件

build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/example/example.ko

这个文件就是我们需要的.ko文件。

OpenWrt内核模块是指在OpenWrt操作系统中用于扩展功能的模块。它可以通过ubox工具箱进行管理。内核模块管理使用kmodloader来管理,包括加载内核模块、移除内核模块以及查看已加载的内核模块状态。\[1\]在编译OpenWrt源码时,可以使用命令"make package/kernel/hello-kernel/compile V=s"来编译驱动模块,并在编译完成后的目录中找到生成的内核模块文件。\[2\]在软件包定义中,可以设置内核模块的一些变量,如SUBMENU、TITLE、FILES、AUTOLOAD和DEPENDS等,以便在make menuconfig中进行配置和管理。\[3\] #### 引用[.reference_title] - *1* [OpenWrt开发必备软件模块——ubox(内核模块、日志管理、UCI配置文件数据类型的验证)](https://blog.csdn.net/qq_41453285/article/details/102621904)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [超详细!手把手演示编译OpenWrt内核驱动模块](https://blog.csdn.net/qq_41453285/article/details/102760270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值