2012-06-11 41 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來分配對齊的內存。