当发生磁盘读或磁盘写时,数据去哪儿了?

Kai*_*die 11 hard-drive filesystems io disk-controller dma

我知道有一个磁盘控制器这样的东西,它包含一个缓冲区,但想知道 CPU 是否直接从这个缓冲区读取,或者数据是否必须首先转到内存中的特定位置,然后允许自己读取由 CPU ?

有谁也知道缓冲区叫什么?DMA 如何适应这一切?

saw*_*ust 21

对于磁盘读取,数据流本质上是:

  • 在读/写组件位于请求的柱面后,选择请求的读/写磁头。
  • 在每个扇区,读取扇区 ID。如果读取的扇区号与请求的扇区号匹配,则读取扇区数据。
  • 扇区数据作为串行位流读取,并转换为字节。
  • 扇区的字节存储在扇区缓冲区中(通常是控制器中的 SRAM);该扇区缓冲区不同于“磁盘缓存”。
  • 读取整个扇区后,数据将使用 ECC 进行验证,并可能更正。
  • 一旦验证通过,扇区数据就会从控制器传输到主机 PC。注意:这个扇区缓冲区的存在并不为人所知,并且存在广泛的错误信息,即主机(例如 ATA)接口上的传输速度受 R/W 头的比特率绑定或限制。这是完全错误的,因为这两个数据传输是独立的顺序操作,而不是并发的。
  • 当 PC 通过 ATA 接口从磁盘控制器接收数据时,PC 可以使用编程的 I/O(CPU 重复读取 ATA 端口的数据寄存器并将值复制到目标内存)或DMA(DMA 控制器是设置将 N 个字节从 ATA 端口的数据寄存器复制到内存缓冲区,而无需 CPU 进一步干预)。
  • 接收数据的 PC 内存“缓冲区”可以是应用程序的缓冲区(当使用块 I/O 系统调用时),或者可以是文件系统控制下的内部系统缓冲区,甚至是程序或数据内存(如果数据来自交换)区域(或页面文件)。

写入磁盘类似,只是数据从PC传输到磁盘控制器,计算ECC,定位请求的扇区,然后将数据从扇区缓冲区写入盘片。

对于额外的信用:

阅读“分散 - 聚集”传输,它使用DMA 链接和内存地址和缓冲区长度的分散 - 聚集列表。代替一个大的、连续的内存缓冲区,“分散-聚集”传输允许使用非连续的内存缓冲区来聚合磁盘 I/O 请求。