我正在为基于FPGA的嵌入式系统开发低级SATA驱动程序。驾驶员运行良好。
当我使用DD命令从磁盘读取扇区时,我可以看到SCSI读取(10)命令(OPCODE 0x28)是由我的低级驱动程序恢复的,我认为正确。但是,当我使用DD命令为磁盘编写扇区时,SCSI驱动程序几次发送第一个读取(10)命令(OPCODE 0x28),然后很少写(10)命令(OpCode 0x2a)。
有人可以解释我,为什么SCSI驱动程序在写操作期间send read()命令?
编辑:在文件写操作期间,我可以看到驱动程序首先从lba 0读取(DMA模式),最高为8个扇区。然后它写入(DMA)SG块,然后读取(PIO)磁盘特定信息。之后,它需要一些随机的LBA,并执行多个读取(DMA),最后通过读取设备特定的数据读取(PIO)停止。这是DD'ING 1KB文件的序列。该磁盘没有分区表,也没有文件系统(经FDisk实用程序验证)。这是驾驶员的正常行为吗?如果是,那么它不会降低操作速度吗?由于整体文件读数比写作操作中的额外读取速度要快。
谢谢
很难具体地说,而无需更多地了解您的系统。想到了两种可能性:
-
Linux正在寻找分区表。如果读取为lba 0和前几个逻辑块,或者读取到设备的末端,则可能是这种情况。
-
您正在文件系统上的文件,并且文件系统正在读取未经元素的元数据。