美文网首页
浅尝辄止85-NTFS文件系统1-内核2-分区引导扇区解析

浅尝辄止85-NTFS文件系统1-内核2-分区引导扇区解析

作者: 阿棍儿_Leon | 来源:发表于2019-02-26 19:29 被阅读0次

    parse_ntfs_boot_sector

    我们从ntfs_fill_super里面可以看到,parse_ntfs_boot_sector是解析分区引导扇区(以下简称引导扇区)信息的地方,今天具体了解一下。
    在看代码之前,我们要注意一下这里。

    result = parse_ntfs_boot_sector(vol, (NTFS_BOOT_SECTOR*)bh->b_data);
    

    需要注意的是,(NTFS_BOOT_SECTOR*)bh->b_data这个强制转换。其实bh->b_data就是引导扇区在内存中的镜像的地址,这个转换就是说NTFS_BOOT_SECTOR这个结构体就是这块内存的解析方法。

    这就提供了一个思路,NTFS分区有数据,数据结构体现在结构体上,了解这些结构体的使用就了解了这个文件系统的逻辑。
    当然,这是在我们没有任何资料的情况下笨而有效的方法。

    这些与layout对应的结构体都在kernel/fs/ntfs/layout.h里面,分区内所有数据都可以在这里找到对应的结构体或成员来表示。

    NTFS_BOOT_SECTOR

    这个结构体相当于引导扇区的内容解析表,比如sle64 mft_lcn就表示这个扇区0x2C偏移的位置存储的是MFT(浅尝辄止84-NTFS文件系统2-layout0提到的$MFT元文件)的簇号。下面的BIOS_PARAMETER_BLOCK bpb有更多的信息。

    typedef struct {
        u8  jump[3];            /* Irrelevant (jump to boot up code).*/
        le64 oem_id;            /* Magic "NTFS    ". */
        BIOS_PARAMETER_BLOCK bpb;   /* See BIOS_PARAMETER_BLOCK. */
        u8  unused[4];          /* zero, NTFS diskedit.exe states that
                           this is actually:
                            __u8 physical_drive;    // 0x80
                            __u8 current_head;  // zero
                            __u8 extended_boot_signature;
                                        // 0x80
                            __u8 unused;        // zero
                         */
    /*0x28*/sle64 number_of_sectors;    /* Number of sectors in volume. Gives
                           maximum volume size of 2^63 sectors.
                           Assuming standard sector size of 512
                           bytes, the maximum byte size is
                           approx. 4.7x10^21 bytes. (-; */
        sle64 mft_lcn;          /* Cluster location of mft data. */
        sle64 mftmirr_lcn;      /* Cluster location of copy of mft. */
        s8  clusters_per_mft_record;    /* Mft record size in clusters. */
        u8  reserved0[3];       /* zero */
        s8  clusters_per_index_record;  /* Index block size in clusters. */
        u8  reserved1[3];       /* zero */
        le64 volume_serial_number;  /* Irrelevant (serial number). */
        le32 checksum;          /* Boot sector checksum. */
    /*0x54*/u8  bootstrap[426];     /* Irrelevant (boot up code). */
        le16 end_of_sector_marker;  /* End of bootsector magic. Always is
                           0xaa55 in little endian. */
    /* sizeof() = 512 (0x200) bytes */
    } __attribute__ ((__packed__)) NTFS_BOOT_SECTOR;
    

    BIOS_PARAMETER_BLOCK

    简单说几个好理解的例子:

    • le16 bytes_per_sector
      每扇区字节数(磁盘硬件决定的)
    • u8 sectors_per_cluster
      每簇扇区数
    typedef struct {
        le16 bytes_per_sector;      /* Size of a sector in bytes. */
        u8  sectors_per_cluster;    /* Size of a cluster in sectors. */
        le16 reserved_sectors;      /* zero */
        u8  fats;           /* zero */
        le16 root_entries;      /* zero */
        le16 sectors;           /* zero */
        u8  media_type;         /* 0xf8 = hard disk */
        le16 sectors_per_fat;       /* zero */
        le16 sectors_per_track;     /* irrelevant */
        le16 heads;         /* irrelevant */
        le32 hidden_sectors;        /* zero */
        le32 large_sectors;     /* zero */
    } __attribute__ ((__packed__)) BIOS_PARAMETER_BLOCK;
    

    相关文章

      网友评论

          本文标题:浅尝辄止85-NTFS文件系统1-内核2-分区引导扇区解析

          本文链接:https://www.haomeiwen.com/subject/pkezyqtx.html