1

我对 Linux 内核完全陌生,所以我可能把事情搞混了。但任何建议都会对我有所帮助;)

我有一个通过 PCIe SATA 卡连接的 SATA HDD,我尝试在块设备上使用read和喜欢。write我还希望将数据断电保存在 HDD 上 - 不缓存。最后我必须分析我在每个 linux 堆栈层中浪费了多少时间。而是一步一个脚印。

目前,我尝试open使用 *O_DIRECT* 访问设备。但是我真的不明白在哪里可以找到该设备。它显示为/dev/sdd,我创建了一个分区/dev/sdd1

  • openread在分区/dev/sdd1工作。write*O_DIRECT* 失败(但我确定我有正确的块大小)
  • open readwrite呼吁/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

4

1 回答 1

1

根据您的 SDD 的块大小(可能是 512 位或 4K),您只能读取/写入该大小的多个。

另外:使用 O_DIRECT 标志时,您需要确保缓冲区与块边界正确对齐。您不能确保使用普通的 char 数组,而是使用 memalign 来分配对齐的内存。

于 2012-10-04T03:39:09.340 回答