生产者-消费者模型
这是驱动程序最通用的软件架构,用于解耦快速的 CPU 和 慢速的 I/O。
结构
通常使用一个固定大小的环形缓冲区 (Circular Buffer/Ring Buffer)。
r指针:读位置。w指针:写位置。
两个视角
以 UART 接收为例:
- 生产者 (中断上下文):
- 用户敲键盘 → 触发中断 →
uartintr运行。 - 读取硬件寄存器里的字符 → 写入 Buffer (
buf[w++])。 - 如果是满的,可能不得不丢弃(Packet Drop)。
- 用户敲键盘 → 触发中断 →
- 消费者 (进程上下文):
- Shell 调用
read→consoleget运行。 - 从 Buffer 读取字符 (
buf[r++])。 - 如果 Buffer 空了 (
r == w),调用sleep进入睡眠,等待中断唤醒。
- Shell 调用
同步机制
必须使用 spinlock 保护 Buffer。因为中断可能在进程正在读 Buffer 时突然发生并修改 Buffer。