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;