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

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-分区引导扇区解析)