【问题标题】:Confusion in disk write operation using DD command使用 DD 命令进行磁盘写操作的混乱
【发布时间】:2016-12-19 12:56:41
【问题描述】:



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

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

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


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

谢谢

【问题讨论】:

  • 每次运行 dd 时它都会执行该序列吗?当新设备上线时,Linux 将扫描分区表,但如果您让设备保持连接并再次运行 dd,它不应该重复这种舞蹈。
  • 是的,对于每个“dd if=somefile.txt of=dev/sda bs=1KB count=1”执行相同的命令序列,让它成为第一次或任意次数。设备始终连接到主机。我们是否必须更改 SCSI 驱动程序中的某些内容?我没有更改 SCSI 驱动程序中的任何内容,我只是在我的低级驱动程序中初始化了一个 SCSI SHT 结构和相关函数。

标签: linux-device-driver dd scsi sata


【解决方案1】:

如果不详细了解您的系统,很难具体说明。我想到了两种可能性:

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

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

【讨论】:

  • 您好,感谢您的回复。我认为你提到的第一个原因是部分正确的。我已编辑问题并添加了有关驾驶员行为的更多信息。
猜你喜欢
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多