当发生磁盘读取或磁盘写入时,数据将流向何处?


Answers:


20

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

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

写入磁盘的方法类似,除了将数据从PC传输到磁盘控制器,计算ECC,找到请求的扇区,然后将数据从扇区缓冲区写入磁盘。

额外的信用:

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


1
也许对“ r / w磁头”的要求不太明确,因为这些天非机械驱动器的使用频率更高,但这是一个很好的答案。
井2011年

@Shinrai-我只有动臂磁盘驱动器的第一手编程经验(并且我使用过固定头驱动器)。我选择不推测或重复关于SSD如何运行的第二手或第三手信息。
木屑

很好的+1记录和书面记录。很专业。
climenole 2012年

2

它进入内核已分配磁盘驱动程序的特定内存区域。我认为它不是专门命名的。该存储区通常配置为环形缓冲区。根据操作系统的不同,可能会第二次将此内存复制到用户空间中以供应用程序使用。

DMA是“直接内存访问”,这意味着硬盘驱动器的控制器可以直接写入到RAM中,而无需CPU的反复询问,如果更多数据(称为轮询-事物的方式用来做)。取而代之的是,当整个缓冲区传输完毕后,控制器便会中断CPU,使其知道现在有可用数据。

如果您对更低的级别感到好奇,则驱动程序会进行ioctl调用。


1
网络设备(例如,以太网控制器)通常会使用环形缓冲区,因为数据可能会未经请求(意外地没有待处理的读取请求)到达。磁盘驱动器/控制器中的数据总是响应主机的请求。请求数据,因此在磁盘驱动程序中不需要“环形缓冲区”。
锯末

好的,我只在驱动程序级别使用DAC,它们也使用环形缓冲区,因此我假设。
亚伦·马拉斯科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.