您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 如何以Module的方式编译驱动
## 1. Linux驱动开发概述
### 1.1 驱动在Linux系统中的角色
Linux驱动是操作系统内核与硬件设备之间的桥梁,负责:
- 硬件设备的初始化与配置
- 提供统一的设备访问接口
- 处理中断和DMA操作
- 电源管理等高级功能
### 1.2 驱动编译的两种主要方式
1. **静态编译**:直接编译进内核镜像
- 优点:启动时自动加载
- 缺点:需要重新编译整个内核
2. **动态模块**:编译为独立.ko文件
- 优点:可动态加载/卸载
- 缺点:需要手动管理
## 2. 模块化驱动开发环境搭建
### 2.1 开发环境要求
```bash
# 基础开发工具
sudo apt install build-essential linux-headers-$(uname -r)
make -C /lib/modules/$(uname -r)/build M=$PWD modules
// hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello module!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye module!\n");
}
module_init(hello_init);
module_exit(hello_exit);
宏 | 作用 |
---|---|
MODULE_LICENSE | 指定模块许可证 |
MODULE_AUTHOR | 声明作者信息 |
MODULE_DESCRIPTION | 模块功能描述 |
MODULE_VERSION | 设置模块版本 |
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean
obj-m := complex_drv.o
complex_drv-objs := file1.o file2.o main.o
# 条件编译
DEBUG = y
ifeq ($(DEBUG),y)
DEBFLAGS = -O -g
else
DEBFLAGS = -O2
endif
CFLAGS += $(DEBFLAGS)
# 1. 编写驱动代码
vim hello.c
# 2. 编写Makefile
vim Makefile
# 3. 执行编译
make
# 4. 查看生成文件
ls -l *.ko
sudo apt install linux-headers-$(uname -r)
nm -D /lib/modules/$(uname -r)/kernel/drivers/... | grep symbol_name
sudo apt-get install libelf-dev
# 加载模块
sudo insmod hello.ko
# 查看已加载模块
lsmod | grep hello
# 查看内核日志
dmesg | tail
# 卸载模块
sudo rmmod hello
printk日志级别:
printk(KERN_DEBUG "Debug message\n");
动态调试:
echo 'file hello.c +p' > /sys/kernel/debug/dynamic_debug/control
GDB调试:
gdb vmlinux /proc/kcore
static int debug_level = 1;
module_param(debug_level, int, 0644);
MODULE_PARM_DESC(debug_level, "Debug level (0-3)");
加载时指定参数:
sudo insmod hello.ko debug_level=2
// 导出符号
EXPORT_SYMBOL(my_function);
// 使用外部符号
extern int external_var;
ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
KDIR=/path/to/cross-kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KDIR) M=$(PWD) modules
# 生成密钥
openssl req -new -x509 -newkey rsa:2048 -keyout key.priv -outform DER -out key.x509 -nodes -days 36500 -subj "/CN=My Company/"
# 签名模块
perl /lib/modules/$(uname -r)/build/scripts/sign-file sha256 key.priv key.x509 hello.ko
#include <linux/version.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,0,0)
// 新内核API
#else
// 旧内核兼容代码
#endif
命令 | 功能 |
---|---|
modinfo | 查看模块信息 |
depmod | 生成模块依赖关系 |
modprobe | 智能加载模块 |
dmesg -w | 实时查看内核日志 |
strace | 跟踪系统调用 |
”`
注:本文实际约3200字,完整3600字版本需要扩展以下内容: 1. 增加更多实战案例(如字符设备驱动示例) 2. 添加内核编译选项的详细说明 3. 扩展调试章节的实战技巧 4. 增加安全性相关的深入讨论 5. 补充更多交叉编译的细节说明
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。