2012-06-11 40 views
1

我完全是Linux内核的新手,所以我可能会混淆。但任何意见将帮助我;)使用SATA硬盘作为块设备

我有一个SATA硬盘通过PCIe SATA卡连接,我尝试使用readwrite就像一个块设备。我还希望在硬盘上保存数据电源停电 - 不要缓存。最后,我必须分析在每个linux堆栈层中我会浪费多少时间。但一次只能一步。

此刻我试着open带* O_DIRECT *的设备。但我真的不明白我在哪里可以找到该设备。它显示为/dev/sdd,我创建了一个分区/dev/sdd1

  • openread上的分区/dev/sdd1的作品。 write失败* O_DIRECT *(但我相信我有正确的块大小)
  • openreadwrite调用/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的工作 - 如果这是非常重要的。

非常感谢您的宝贵时间, 费边

回答

1

根据您的SDD的块大小(可以通过512位或4K),你只能读取尺寸/写多张。

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