-1



我正在为基于 FPGA 的嵌入式系统开发低级 SATA 驱动程序。司机运行良好。

当我使用 dd 命令从磁盘读取扇区时,我可以看到 SCSI read(10) 命令(操作码 0x28)被我的低级驱动程序接收,我认为这是正确的。但是,当我使用 dd 命令将扇区写入磁盘时,SCSI 驱动程序会多次发送第一次读取(10)命令(操作码 0x28),然后发送少量写入(10)命令(操作码 0x2A)。

有人可以解释一下,为什么 SCSI 驱动程序在写操作期间发送 read() 命令?


编辑:在文件写入操作期间,我可以看到驱动程序首先从 LBA 0 读取(DMA 模式)到大约 8 个扇区。然后它写入 (DMA) sg 块,然后读取 (PIO) 磁盘特定信息。之后,它需要一些随机 LBA 并执行几次读取(DMA),最后它通过读取设备特定数据读取(PIO)来停止。这是 dd'ing 1KB 文件的序列。该磁盘没有分区表,也没有文件系统(通过 fdisk 实用程序验证)。这是司机的正常行为吗?如果是,那么它不会降低运行速度吗?由于写入操作中的额外读取,整体文件读取比写入快。

谢谢

4

1 回答 1

1

在不了解您的系统的情况下很难具体说。想到了两种可能:

  1. Linux 正在寻找分区表。如果读取的是 LBA 0 和前几个逻辑块,或者读取的是设备的最末端,其中有一个辅助 GPT 标头,则很可能是这种情况。

  2. 您正在文件系统上添加文件,并且文件系统正在读取未缓存的元数据。

于 2016-12-19T16:00:45.213 回答