我想了解sys_write
scsi 设备上的 a 是如何工作的。因此我写了一个简单的测试程序,并在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 字节应该是块大小。这就是我得到这个值的方式:
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
如果数据在驱动器的内部缓存中,我能保证吗?还是我可以做更多的事情来进行安全写入?
非常感谢你 :)