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 实现与定义。
相关推荐
浮尘笔记13 分钟前
Java Snowy框架CI/CD云效自动化部署流程
java·运维·服务器·阿里云·ci/cd·自动化
测试修炼手册7 小时前
[测试工具] 用 Codex 做测试实战:从需求分析到自动化用例落地
运维·自动化·需求分析
米高梅狮子7 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
June`7 小时前
网络编程时内核究竟做了什么???
linux·服务器·网络
原来是猿7 小时前
腾讯云服务器端口开放完全指南
服务器·网络·腾讯云
你的保护色8 小时前
【无标题】
java·服务器·网络
楼兰公子8 小时前
RK3588 + Linux7.0.3 网络工程调试错误速查手册
linux·网络·3588
Elnaij8 小时前
Linux系统与系统编程(9)——自设计shell与基础IO
linux·服务器
IpdataCloud8 小时前
稳定的企业级IP数据接口怎么选?可用性指标+离线库高可用方案
运维·网络·tcp/ip
WebGIS开发8 小时前
地信职业百科②:GIS运维
运维·gis·就业·转行