Linux内核驱动--设备驱动

一、驱动概念

设备驱动(Device Driver) 是连接硬件与操作系统内核的桥梁。它使得上层应用程序能够通过统一的接口访问底层硬件资源,而无需关心具体的硬件细节。Linux 内核将设备抽象为三大类:字符设备、块设备 和 网络设备,每种类型对应不同的数据访问模式和驱动模型。

二、驱动分类

类型 访问方式 典型设备 缓冲机制 主要系统调用
字符设备 字节流(顺序/随机) 串口、键盘、LED、ADC 无(或简单缓冲) open, read, write, ioctl
块设备 固定大小块(通常512B/4KB) 硬盘、SD卡、eMMC 有(内核页缓存) open, read, write, fsync
网络设备 数据包(报文) 以太网卡、Wi-Fi 模块 有(sk_buff 缓冲区) socket, send, recv(非文件操作)

三、Linux 字符设备驱动架构图

四、字符设备驱动的核心组件

1. struct file_operations ------ 驱动的"接口表"

这是字符设备驱动的灵魂,定义了用户空间调用系统调用时内核应执行的函数。
cs 复制代码
static struct file_operations demo_fops = {
    .owner = THIS_MODULE,
    .open = demo_open,
    .release = demo_release,
    .read = demo_read,
    .write = demo_write,
};
  • open():设备打开时调用(如 fd = open("/dev/demo", O_RDWR))
  • release():close(fd) 时调用,释放资源
  • read() / write():核心数据传输函数

2. 设备号(Device Number)

每个字符设备由 主设备号(Major) + 次设备号(Minor) 唯一标识。
  • 主设备号:标识设备类型(如 4 表示 TTY)
  • 次设备号:区分同一类型的不同实例(如 ttyS0、ttyS1)
cs 复制代码
// 静态指定
int major = register_chrdev(200, "mydev", &demo_fops);
3. cdev 结构体 ------ 内核中的字符设备对象

现代 Linux 使用 cdev 结构管理字符设备:

cs 复制代码
struct cdev my_cdev;

// 初始化并绑定 fops
cdev_init(&my_cdev, &demo_fops);
my_cdev.owner = THIS_MODULE;

// 添加到内核
cdev_add(&my_cdev, dev, 1);  // dev 是 alloc_chrdev_region 返回的 dev_t

五、高效开发利器:ctags 源码导航

在开发字符设备驱动时,经常需要查阅内核源码中的函数定义、结构体成员和宏展开。ctags 是一个强大的代码索引工具,可让你在 Vim、Emacs 或 VS Code 中快速跳转到符号定义。

1. 安装 ctags

cs 复制代码
# Ubuntu/Debian
sudo apt install exuberant-ctags

# CentOS/RHEL
sudo yum install ctags

2. 在内核源码目录生成 tags 文件

cs 复制代码
ctags -R

3. 在编辑器中使用 ctags

  • 将光标放在函数名上(如 cdev_add)
  • 按 Ctrl + ] → 跳转到定义
  • 按 Ctrl + t → 返回上一位置
  • :ts → 显示所有匹配项(适用于重载)

六、总结

  • 字符设备驱动是 Linux 最基础的驱动类型,用于以字节流方式访问硬件(如 LED、串口、传感器等)。
  • 通过 file_operations 结构体将用户系统调用(open/read/write/ioctl)映射到内核函数。
  • 通过 cdev_add() 注册设备。
  • 开发过程中配合 ctags 工具(ctags -R)可快速跳转内核源码,高效查阅 API 实现与定义。
相关推荐
码农学院1 小时前
基于运维监控体系的网络品牌推广方案:从架构设计到技术实现
运维·网络
爱写代码的森8 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
大耳朵-小飞象10 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技11 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
HLC++11 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室12 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
白露与泡影13 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
神奇霸王龙14 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
Web极客码14 小时前
WordPress SEO优化:提升网站排名的13个关键步骤
服务器·seo·wordpress
生活爱好者!14 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器