我对Linux内核完全不熟悉,所以我可能会混淆一下 . 但任何建议都会对我有帮助;)
我有一个通过PCIe SATA卡连接的SATA硬盘,我尝试在块设备上使用 read
和 write
. 我还希望将数据电源中断保存在硬盘上 - 而不是缓存 . 最后,我必须分析每个linux堆栈层中的松散时间 . 但是一步一步 .
目前我尝试使用* O_DIRECT *设备 open
. 但我真的不明白我在哪里可以找到这个设备 . 它显示为 /dev/sdd
,我创建了一个分区 /dev/sdd1
.
分区 /dev/sdd1
上的
-
open
和read
有效 .write
失败并带有* O_DIRECT *(但我确定我有正确的块大小)
009open
read
和write
呼叫/dev/sdd
完全失败 . -
/dev/
中是否有另一个文件代表我的设备在块图层上? -
我的错误和错误的假设是什么?
这是我目前的测试代码
int main() {
int w,r,s;
char buffer[512] = "test string mit 512 byte";
printf("test\n");
// OPEN
int fd = open("/dev/sdd", O_DIRECT | O_RDWR | O_SYNC);
printf("fd = %d\n",fd);
// WRITE
printf("try to write %d byte : %s\n",sizeof(buffer),buffer);
w = write(fd,buffer,sizeof(buffer));
if(w == -1) printf("write failed\n");
else printf("write ok\n");
// RESET BUFFER
memset(buffer,0,sizeof(buffer));
// SEEK
s = lseek(fd,0,SEEK_SET);
if(s == -1) printf("seek failed\n");
else printf("seek ok\n");
// READ
r = read(fd,buffer,sizeof(buffer));
if(r == -1) printf("read failed\n");
else printf("read ok\n");
// PRINT BUFFER
printf("buffer = %s\n",buffer);
return 0;
}
编辑:我在电源架构上使用3.2内核 - 如果这很重要的话 .
非常感谢您的时间,Fabian
1 回答
根据SDD的块大小(可以是512位或4K),您只能读取/写入该大小的多个块 .
另外:当使用O_DIRECT标志时,您需要确保缓冲区正确对齐以阻止边界 . 您无法确保使用普通的char数组,而是使用memalign来分配对齐的内存 .