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 实现与定义。
相关推荐
Agent产品评测局8 分钟前
生产排期与MES/ERP系统打通,实操方法详解:2026企业级智能体与超自动化集成实战指南
运维·人工智能·ai·chatgpt·自动化
CodeOfCC10 分钟前
Linux 嵌入式arm64安装openclaw
linux·运维·服务器
绿虫光伏运维14 分钟前
一文理清光伏运维的内容、常见问题与重要措施
大数据·运维·光伏业务
羑悻的小杀马特41 分钟前
零成本搞定!异地访问 OpenClaw 最简方案:SSH 端口映射组网!
运维·服务器·人工智能·docker·自动化·ssh·openclaw
NineData1 小时前
NineData 亮相 2026 德国汉诺威工业博览会,加速拓展欧洲及全球市场
运维·数据库·人工智能·数据库管理·ninedata·ai服务·玖章算术
宵时待雨1 小时前
linux笔记归纳3:linux开发工具
linux·运维·笔记
magrich1 小时前
安装NoMachine并解决无外接显示器桌面黑屏
linux·运维·服务器
fish_xk2 小时前
Linus基础指令
linux·服务器
L1624762 小时前
Nginx 6 种发布方式(滚动发布、蓝绿发布(Blue/Green)、金丝雀发布(Canary 灰度)等) 实操全集(配置 + 分步操作 + 回滚)
运维·nginx
宁波阿成2 小时前
在ubuntu22.04源码级安装sub2api
linux·运维·ubuntu·ai·api·token·中转站