Lienol OpenWrt内核模块开发:深入理解嵌入式系统底层原理
Lienol OpenWrt作为一款高度定制化的嵌入式Linux系统,为开发者提供了强大的内核模块开发平台。本文将带你探索内核模块开发的核心流程,从环境搭建到模块调试,全方位掌握嵌入式系统底层开发技巧。[
TITLE:=Atheros wireless cards support
DEPENDS:=@PCI_SUPPORT +kmod-mac80211
KCONFIG:= \
CONFIG_ATH_CARDS \
CONFIG_ATH_COMMON
FILES:=$(MODULES_DIR)/kernel/drivers/net/wireless/ath/ath.ko
AUTOLOAD:=$(call AutoProbe,ath)
endef
这类定义通常位于package/kernel/mac80211目录下的各个.mk文件中,如package/kernel/mac80211/ath.mk。
2.2 模块配置选项
每个内核模块可以通过KCONFIG字段定义内核配置选项,通过FILES字段指定要编译的内核模块文件,通过AUTOLOAD字段设置自动加载参数。
三、编写第一个内核模块
3.1 创建模块目录结构
在package/kernel目录下创建新的模块目录:
package/kernel/mymodule/
├── src/
│ └── mymodule.c
├── Makefile
└── Config.in
3.2 编写模块代码
模块源代码(mymodule.c)基本结构:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Lienol OpenWrt Sample Module");
static int __init mymodule_init(void) {
printk(KERN_INFO "My Lienol OpenWrt module loaded\n");
return 0;
}
static void __exit mymodule_exit(void) {
printk(KERN_INFO "My Lienol OpenWrt module unloaded\n");
}
module_init(mymodule_init);
module_exit(mymodule_exit);
3.3 编写Makefile
模块Makefile:
include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=mymodule
PKG_RELEASE:=1
include $(INCLUDE_DIR)/package.mk
define KernelPackage/mymodule
SUBMENU:=Other modules
TITLE:=My Sample Kernel Module
FILES:=$(PKG_BUILD_DIR)/mymodule.ko
AUTOLOAD:=$(call AutoLoad,30,mymodule)
endef
define KernelPackage/mymodule/description
A sample kernel module for Lienol OpenWrt
endef
MAKE_OPTS:= \
ARCH="$(LINUX_KARCH)" \
CROSS_COMPILE="$(TARGET_CROSS)" \
M="$(PKG_BUILD_DIR)"
define Build/Compile
$(MAKE) -C "$(LINUX_DIR)" $(MAKE_OPTS) modules
endef
$(eval $(call KernelPackage,mymodule))
四、模块编译与调试
4.1 配置与编译
make menuconfig # 在Kernel modules中选择你的模块
make package/kernel/mymodule/compile V=s
4.2 模块测试
将编译好的.ko文件传输到目标设备:
scp bin/targets/*/*/packages/mymodule_*.ipk root@192.168.1.1:/tmp
ssh root@192.168.1.1 opkg install /tmp/mymodule_*.ipk
查看模块加载情况:
dmesg | grep "My Lienol OpenWrt module"
lsmod | grep mymodule
五、高级技巧与最佳实践
5.1 使用内核调试工具
OpenWrt提供了多种内核调试工具,位于:
- package/devel/gdb:GNU调试器
- package/devel/strace:系统调用跟踪工具
5.2 模块依赖管理
在KernelPackage定义中正确设置DEPENDS字段,确保模块加载顺序正确。例如:
DEPENDS:=+kmod-mac80211 +kmod-ath
5.3 版本兼容性处理
参考include/kernel-version.mk中的宏定义,处理不同内核版本间的兼容性问题:
ifeq ($(KERNEL_PATCHVER),5.4)
# 5.4内核特定代码
else
# 其他内核版本代码
endif
通过本文的指南,你已经掌握了Lienol OpenWrt内核模块开发的基础知识。无论是开发硬件驱动还是系统功能扩展,这些技能都将帮助你深入嵌入式系统底层,释放OpenWrt的全部潜力。
【免费下载链接】openwrt Lienol's Modified OpenWrt source 项目地址: https://gitcode.com/gh_mirrors/ope/openwrt
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐




所有评论(0)