# Linux 字符设备驱动

上一篇：[[16 Linux 内核模块开发]]
返回目录：[[Linux 学习指南]]
下一篇：[[18 Linux 内核与文件系统课程设计]]

> [!info] 来源
> 整理自 [[操作系统课程设计指导书]] 的实验三。

## 核心对象

- 设备号：由主设备号和次设备号组成，用于定位驱动和具体设备。
- `struct cdev`：表示字符设备并关联操作方法。
- `struct file_operations`：实现 `open`、`read`、`write`、`release` 等文件操作。
- `struct inode`：描述设备文件的元数据。
- `struct file`：描述一次打开实例及其状态。

## 开发流程

1. 分配设备号（静态 `register_chrdev_region` 或动态 `alloc_chrdev_region`）。
2. 初始化并注册 `cdev`，填写 `file_operations`。
3. 编译并加载内核模块。
4. 使用 `mknod` 或 `udev` 建立设备节点。
5. 测试用户态程序的打开、读写和关闭。
6. 注销 `cdev`、释放设备号并卸载模块。

```bash
sudo mknod /dev/demo c <主设备号> <次设备号>
sudo chmod 666 /dev/demo
```

设备节点权限不能替代驱动中的边界检查；`copy_to_user`、`copy_from_user` 的返回值必须检查，避免直接解引用用户态指针。
