生产者-消费者模型

这是驱动程序最通用的软件架构,用于解耦快速的 CPU慢速的 I/O

结构

通常使用一个固定大小的环形缓冲区 (Circular Buffer/Ring Buffer)

  • r 指针:读位置。
  • w 指针:写位置。

两个视角

以 UART 接收为例:

  1. 生产者 (中断上下文):
    • 用户敲键盘 触发中断 uartintr 运行。
    • 读取硬件寄存器里的字符 写入 Buffer (buf[w++])。
    • 如果是满的,可能不得不丢弃(Packet Drop)。
  2. 消费者 (进程上下文):
    • Shell 调用 read consoleget 运行。
    • 从 Buffer 读取字符 (buf[r++])。
    • 如果 Buffer 空了 (r == w),调用 sleep 进入睡眠,等待中断唤醒。

同步机制

必须使用 spinlock 保护 Buffer。因为中断可能在进程正在读 Buffer 时突然发生并修改 Buffer。