Skip to content

模型Model

设备I/O、DMA与完成边界

Device I/O and DMA · Polling interrupt DMA

给设备请求建立提交、数据搬运、命令完成和稳定存储四个边界,核验描述符所有权、DMA地址与缓冲生命周期。

形式陈述 ​

设备驱动把内核请求转换成设备理解的命令。OS-16设备提供命令队列、完成队列和门铃寄存器;驱动先填写(requestID, operation, block, buffer, length)描述符并发布,再写门铃通知设备。设备读取描述符,搬运数据,最后发布完成记录。轮询与中断是发现完成的两种方式,不改变命令本身的意义。

DMA允许设备直接读写指定内存缓冲,而非CPU逐字节搬运。本文要求驱动使用已登记DMA地址,并在设备持有期间保持物理页pin与所有权。真实系统DMA地址可以经IOMMU或桥接映射,不能把普通用户虚指针直接当成设备地址。

OS-16明确区分四个事件:

  • 提交:设备可以看到完整描述符
  • 搬运完成:设备已完成对主存缓冲的读或写
  • 命令完成:完成队列报告该命令的结果
  • 持久化完成:需要保留的数据已到掉电保留区

对普通块写,OS-16命令完成只要求设备已把数据接收到自己的易失缓存。后续flush成功才要求该队列此前写入全部稳定。主存缓存一致性、DMA可见性和断电持久性是三种不同合同。

直觉

中断相当于设备发来通知,DMA是搬运方式,flush是保存承诺。一次操作可以用DMA搬运、用中断报告完成,同时仍没有把数据放到掉电保留区。把三个名字混成“硬盘完成”会漏掉实际故障窗口。

描述符本身也是数据。若CPU先敲门铃、后补长度,设备可能看见旧长度;若缓冲提交后马上给别的请求复用,设备可能搬到后写入的内容。设备是否与CPU缓存一致,都不免除发布顺序与所有权约束。

例子与边界

完成中断之后仍可丢失 ​

稳定块30初值为OLD。内核缓冲B含NEW,长度256B,其页被pin。驱动准备写请求R7、完成发布屏障、敲门铃。设备DMA读取B到易失缓存,放入成功完成记录并发中断。驱动匹配R7、确认没有后续DMA使用,解除pin;此时稳定块30仍可为OLD。

若立刻掉电,易失缓存丢失,重启读OLD。这条执行没有违反OS-16普通写完成语义。驱动若继续提交flush,并等其成功,稳定块30才必须为NEW;这时掉电仍恢复NEW。失败或超时的flush不能当作成功,结果可能未知。

读DMA方向相反 ​

设备读请求R8把块40写到主存缓冲C。驱动不能在DMA尚未完成时让CPU消费C;非一致DMA系统还要按平台接口把设备写入转为CPU可见。完成后CPU才读取有效字节。写方向是设备读主存,读方向是设备写主存,名称以文件/设备操作方向命名,易造成反向理解。

若读DMA仍在途时解除pin并把C的页分给另一进程,设备稍后落下的数据将覆盖该进程内存。TLB和用户页权限无法拦住未受约束的设备访问;IOMMU权限与DMA映射生命周期需要单独管理。

推论与应用

请求ID避免将迟到或乱序完成归给新请求。环形队列复用槽位时还需要代际或所有权位;仅比较槽号可能把上一次绕环的完成误认成本次完成。OS-16在每个请求完成且无人持有描述符后才复用其ID和槽。

安全不变量是:设备只能访问已发布且由它持有的缓冲;CPU不在不允许的阶段改变其内容;每个完成只交还对应请求的所有权。提交有序、pin持续和完成匹配三者分别保护描述符、物理内存和生命周期。保持这些不变量不保证设备永不故障,还需把错误传播到上层。

CPU节约的是逐字节复制工作,不是所有I/O成本。描述符设置、地址映射、同步、设备总线搬运和中断处理仍需计费。小请求可能被固定成本主导,批量队列可摊薄该成本;DMA存在本身不证明吞吐一定更好。

把本页设备所有权交给可提前返回的执行器时,继续读异步取消与安全退休:deadline只结束逻辑等待,目标终结、取消回执和最后借用各自记账;缓冲归池与请求身份退休也可发生在不同时间。本页的DMA发布、pin与flush边界不因此改变。

参考资料
  • Remzi与Andrea Arpaci-Dusseau,OSTEP: I/O Devices,第36章,轮询、中断与DMA。
  • Linux Kernel Documentation,Dynamic DMA mapping Guide,2026-10-08核查,CPU虚/物理/DMA地址、所有权和一致映射仍需内存屏障的边界。本文设备写完成与flush契约为OS-16明示模型。
关系图谱8 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组