技术知识库

字符设备驱动 MOC

字符设备驱动 MOC

本章目标

对应实验手册第 6 章。先通过可以运行的字符设备实验,掌握设备号、cdev、file_operations、设备节点和用户空间数据复制之间的关系;完成本章全部实验后,再集中阅读驱动框架及内核源码调用链。

概念导读

主线笔记

故障复盘

当前进度

  • 动态申请设备号。
  • 动态分配并注册 cdev。
  • 用 file_operations 接通 open、read 和 write。
  • 用 class_create()、device_create() 自动暴露 /dev/martin_mailbox。
  • 用 copy_from_user() 和 copy_to_user() 完成内存邮箱读写闭环。
  • 用 misc_register() 简化注册,并通过 /dev/misc_mailbox 完成读写闭环。
  • 理解 misc 设备共用主设备号 10、依靠次设备号区分。
  • 实验 6-3:普通缓冲区虚拟设备读写;已合并在 misc_mailbox 实验中。
  • 实验 6-4:用 KFIFO 替换普通缓冲区,并通过 /dev/kfifo_mailbox 完成读写。
  • 复现并修复 KFIFO 写满后零长度写导致用户空间持续重试的问题。
  • 实验 6-5:满 FIFO 的非阻塞写已返回 -EAGAIN。
  • 实验 6-5:空 FIFO 的非阻塞读尚待实际验证。
  • 实验 6-6:使用等待队列实现阻塞读取,并观察到空 FIFO 上的 cat 进入等待。
  • 实验 6-7:8 个独立 misc + KFIFO + poll 模块已完成 ARM64 交叉编译,目标系统运行验证待完成。
  • 实验 6-8:已正确解释共享设备状态与每次 open() 私有状态导致的唤醒差异;故意错误的目标系统复现作为可选验证保留。
  • 实验 6-9:FASYNC/SIGIO 通知闭环已验证,写入 13 字节后监听进程异步读取 13 字节。
  • 实验 6-9 进阶:fasync_insert_entry() Oops 已建立用户态 GDB 类比实验,尚待调试。
  • 完成本章其余实验。
  • 第 6 章完成后,集中补充驱动框架、VFS 分发路径和相关源码调用链。

延后阅读清单

以下内容不是当前实验的完成阻塞项,统一留到第 6 章实验结束后:

  • /dev/martin_mailbox 的 open() 如何经 VFS 找到 cdev 和 file_operations。
  • alloc_chrdev_region()、cdev_add()、class_create()、device_create() 的内核实现。
  • copy_to_user()、copy_from_user() 的架构相关实现与异常处理。
  • 设备模型、sysfs、devtmpfs 和 udev 的协作过程。
  • misc_open() 如何按次设备号找到 struct miscdevice 并切换到驱动的 file_operations。
  • KFIFO 如何用递增索引和 2 的幂掩码实现环形寻址。
  • poll_wait() 如何把 epoll 回调挂入设备等待队列,以及 ep_poll_callback() 如何生成就绪事件。
  • fcntl(F_SETFL, FASYNC) 到驱动 .fasync、fasync_helper() 的调用链。

关联