我知道有一种磁盘控制器包含一个缓冲区,但我想知道 CPU 是否直接从这个缓冲区读取,或者数据是否必须先进入内存中的特定位置,然后允许 CPU 读取?
还有人知道缓冲区叫什么吗?DMA 与这一切有何关系?
答案1
对于磁盘读取,数据流基本上是:
- 当读/写组件到达请求的柱面后,选择请求的读/写头。
- 在每个扇区,读取扇区 ID。如果读取的扇区号与请求的扇区号匹配,则读取扇区数据。
- 扇区数据被读取为串行位流,并转换为字节。
- 扇区的字节存储在扇区缓冲区(通常是控制器中的 SRAM);这扇区缓冲区与“磁盘缓存”不同。
- 一旦读取了整个扇区,就会使用 ECC 来验证数据,甚至可能进行更正。
- 一旦验证通过,扇区数据将从控制器传输到主机 PC。注意:此扇区缓冲区这一点并不为人所知,而且有种普遍的错误信息,认为主机(例如 ATA)接口的传输速度受 R/W 头的比特率约束或限制。这完全是错误的,因为这两个数据传输是独立且连续的操作,而不是并发的。
- 由于 PC 通过 ATA 接口从磁盘控制器接收数据,因此 PC 可以使用程控输入/输出(CPU 重复读取 ATA 端口的数据寄存器并将值复制到目标内存)或直接接入(DMA 控制器设置为将 N 个字节从 ATA 端口的数据寄存器复制到内存缓冲区,无需进一步的 CPU 干预)。
- 接收数据的 PC 内存“缓冲区”可能是应用程序的缓冲区(使用块 I/O 系统调用),或者可能是文件系统控制下的内部系统缓冲区,或者如果数据来自交换区域(或页面文件),甚至是程序或数据内存。
写入磁盘类似,只是数据从 PC 传输到磁盘控制器,计算 ECC,找到请求的扇区,然后将数据从扇区缓冲区写入盘片。
额外加分:
阅读“分散-聚集“转移,使用DMA 链接以及内存地址和缓冲区长度的分散-集中列表。“分散-集中”传输允许使用非连续的内存缓冲区来聚集磁盘 I/O 请求,而不是使用一个大的连续内存缓冲区。