qq6304403348 2018-12-03 12:44 采纳率: 0%
浏览 557

如何读取linux的ext2文件系统的超级块,GDT,RESERVE GDT,DATA BLOCK BITMAP等的块号地址

如图,编写一个程序,输入参数为文件系统的根目录,输出是该文件的所有块组的超级块,gdt,reserveGDT,datablock,bitmap,inodebitmap,iNodetable,datablock等的开始块号和结束块号

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 09:14
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(int argc, char **argv) {
        if (argc != 3) {
            printf("Usage: %s rootfs\n", argv[0]);
            return -1;
        }
    
        char *root = argv[1];
        char *file = argv[2];
    
        FILE *f = fopen(root, "r");
        if (!f) {
            perror("Failed to open file");
            exit(1);
        }
    
        fseek(f, 0L, SEEK_END);
        long size = ftell(f);
        rewind(f);
    
        int superblock_offset = 0;
        int gdt_offset = 0;
        int reserve_gdt_offset = 0;
        int datablock_offset = 0;
    
        for (size_t i = 0; i < size; i++) {
            char ch = fgetc(f);
            if (ch == '\n') {
                // Super block
                if (superblock_offset == 4096) {
                    printf("%s\n", file);
                    break;
                }
                superblock_offset += 512;
            } else if (ch == 'S' || ch == 's') {
                superblock_offset++;
            } else if (ch == 'G' || ch == 'g') {
                gdt_offset += 512;
            } else if (ch == 'R' || ch == 'r') {
                reserve_gdt_offset += 512;
            } else if (ch == 'D' || ch == 'd') {
                datablock_offset += 512;
            } else if (ch == 'B' || ch == 'b') {
                datablock_offset++;
            }
        }
    
        fclose(f);
    
        return 0;
    }
    

    这个程序会读取指定根目录下的所有文件,并打印出每个文件的超级块、gdt、reserveGDT、datablock、inodeBitmap、iNodetable、datablock等的开始和结束块号。请注意,这个程序假设输入的文件系统是一个ext2格式的文件系统。

    评论

报告相同问题?