2011-05-17 33 views
3

我在閱讀ext2分區的超級塊時看到過一些問題,但我有些問題沒有在這些問題中得到解答。
這裏他們去:
1.使用read()從磁盤讀取到ext2_super_block結構中應該要求結構中的所有字段按照它們在代碼中呈現的順序進行編譯,以及必須在那裏沒有結構填充(或正確的結構填充)。這是如何保證的?
2. Linux在非特權級別嘗試從設備讀取時的行爲如何?讀取必須有一個初始偏移量(更準確地說,禁止訪問前N個字節),因爲我寫的程序僅在以root身份運行時纔有效。無論如何,Linux在這種情況下的表現如何?
3.我在哪裏可以找到有關使用ext2/ext3的良好文檔?到目前爲止,我一直在閱讀/usr/include/linux/ext2_fs.h和一些隨機文件,但沒有發現任何完整的東西。將ext2超級塊讀入ext2_super_block結構問題

我也想聽聽建議/下面的代碼,至今工作正常在我的機器上的修正(包括略去了,該程序打印「ef53」):

int main() { 
    int fd; 
    char boot[1024]; 
    struct ext2_super_block super_block; 

    fd = open("/dev/sda1", O_RDONLY); 

    /* Reads the boot section and the superblock */ 
    read(fd, boot, 1024); 
    read(fd, &super_block, sizeof(struct ext2_super_block)); 

    /* Prints the Magic Number */ 
    printf("%x\n", super_block.s_magic); 

    close(fd); 

    return 0; 
} 

在此先感謝。

+0

ext2fs類似於UFS和FFS,所以你可以參考這些文檔(雖然ext2每塊總是有1個片段)。 – ninjalj 2011-08-02 22:36:16

回答

0

所有在結構中的字段編譯它們在代碼

提出我不知道C編譯器,其重新排序字段結構的順序。我不認爲這是C標準允許的。 對於alingnemt和填充看結構的聲明。涉及一些宏。

當非特權設備從設備讀取時,Linux如何運行?

讓問ls

[email protected]:~> ls -l /dev/sda 
brw-rw---- 1 root disk 8, 0 15. Mai 17:51 /dev/sda 

只能理解爲根,或者如果你是在disk組。

我在哪裏可以找到有關使用ext2/ext3的良好文檔?

使用源,盧克。不要忘記,有更多的Linux內核可以讀取ext2/3。

+0

謝謝,沒有錯誤檢查open()的返回值,並認爲我正在從FD正確讀取,甚至沒有檢查/ dev/sda1的權限。至於重新排列struct「man gcc」的字段,尋找-Wpadded,你會看到,重新排列是可能的..這將是很好,如果我們可以以某種方式諮詢標準(我剛發現不是免費的)。而且,這也意味着在閱讀時字節順序很重要,對吧?你怎麼看? – 2011-05-18 00:11:39

0

我跑進一些你的問題在我尋求答案。

  1. ext2_super_block struct已被設置爲按順序/填充到規範。你可以創建自己的或使用標準之一。

  2. 的open()函數將返回小於0,如果有錯誤,你可以調用printf("Error: %s\n", strerror(errno));打印錯誤。如果返回類似「權限被拒絕」,然後使用sudo chmod 777 /dev/yourdevice如果在Ubuntu的終端將權限授予它。

  3. 我自己找不到太多的文檔,如果有幫助,我可以通過我的代碼打開設備。

+0

我已經成功從分區中讀取數據,列出目錄和讀取文件,並做了很多工作。我仍然想知道具有不同字節字節順序的兩臺機器如何讀取同一個超級塊,以及如何確保編譯器不會重新排列結構中的字段。我查看了/usr/src/linux/include/linux/ext2_fs.h並沒有發現任何告訴編譯器這樣做的東西。你能解釋一下這個結構是如何設置爲有序/填充的?這是阻止我接受你的答案的唯一因素。 – 2012-01-07 23:17:30

+1

超級塊存儲在little-endian中,而不是以系統字節序存儲:http://www.nongnu.org/ext2-doc/ext2.html#DEF-SUPERBLOCK'超級塊中的所有字段(如在所有其他ext2結構中)以小端格式存儲在光盤上,所以文件系統可以在機器之間移植,而不需要知道它是在什麼機器上創建的。' – mcmlxxxvi 2014-11-14 08:22:58

+1

至於填充,這裏是GCC的'-Wpadded'手冊:'如果填充包含一個結構,要麼對齊結構的一個元素,要麼對齊整個結構。有時候發生這種情況時,可能會重新排列結構的字段以減少填充,從而使結構更小。「我相信它應該被讀爲_it可能是程序員**(不是編譯器)重新排列這些字段可以減少padding_。特別是因爲這是一個警告,而不是優化指令。 – mcmlxxxvi 2014-11-14 08:25:12

0

請試試這個;

#include <stdio.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <./linux/ext2_fs.h> 
int main(int argc, char *argv[]) 
{ 
struct ext2_super_block es; 
int f; 
char but[1024]; 

    f = open("/dev/sda1", O_RDONLY); 
    read(f, but, 1024); 
    read(f, &es, sizeof(struct ext2_super_block)); 
    printf("El tamano de int es %d byts\n", sizeof(int)); 
    printf("El tamano de char es %d byts\n", sizeof(char)); 
    printf("Número de inodos: %d \n", es.s_inodes_count); 
    printf("Número de bloques: %d \n", es.s_blocks_count); 
    printf("Número de bloques libres: %d \n", es.s_free_blocks_count); 
    printf("Número de inodos libres: %d \n", es.s_free_inodes_count); 
    printf("Tamano del bloque: %d \n", es.s_log_block_size); 
    printf("Bloques en un grupo: %d \n", es.s_blocks_per_group); 
    printf("Fragmentos en un grupo: %d \n", es.s_frags_per_group); 
    printf("NM: %x\n", es.s_magic); 

return (0); 
} 
+0

對不起,但我的問題是沒有從文件系統讀取信息。實際上,我對C標準在結構內存佈局上缺乏標準化可能會危及使用在不同編譯器或不同架構下編譯的代碼來讀取分區感興趣。 – 2013-09-10 00:39:37