为什么在sys_write()期间读取SCSI命令

时间:2012-07-04 14:38:00

标签: linux io device-driver scsi

我想了解scsi设备上的sys_write是如何工作的。因此我编写了一个简单的测试程序,并在设备驱动程序的issue函数中添加了一些调试printk()来打印ata_queued_cmd->scsicmd->cmnd

int main() {
    int w;
    char buffer[512] = "test string with 512 byte";

    // OPEN
    int fd = open("/dev/sdd", O_WRONLY | O_SYNC);

    // WRITE
    w = write(fd,buffer,sizeof(buffer));

    return 0;
}

/var/log/messages中,我可以看到以下发出的命令:

  scsicmd->cmnd
------------------------------
 0x28 | READ(10)
 0x2A | WRITE(10)
 0x35 | SYNCHRONIZE CACHE (10)

我想写的512字节应该是blocksize。这就是我得到这个值的方法:

root$ blockdev --getsize /dev/sdd # returns size in sectors
488397168
root$ blockdev --getsize64 /dev/sdd # returns size in sectors
250059350016
root$ python -c "print 250059350016.0/488397168"
512.0

对我来说非常重要的是,数据是电源故障安全编写的。这就是为什么我要等待O_SYNC的重新定位的原因。现在我有一些问题:

  • 为什么READ之前有WRITE
  • SYNCHRONIZE CACHE是否保证,如果数据位于驱动器的内部缓存中?或者我可以做更多的安全写作吗?

非常感谢:)

1 个答案:

答案 0 :(得分:0)

好的我现在明白了。他们读取它以将数据加载到内部内核缓冲区中,因此当您有多次写入/读取时,数据已经被缓冲。