parse_ntfs_boot_sector
我們從ntfs_fill_super里面可以看到,parse_ntfs_boot_sector是解析分區(qū)引導(dǎo)扇區(qū)(以下簡稱引導(dǎo)扇區(qū))信息的地方,今天具體了解一下。
在看代碼之前,我們要注意一下這里。
result = parse_ntfs_boot_sector(vol, (NTFS_BOOT_SECTOR*)bh->b_data);
需要注意的是,(NTFS_BOOT_SECTOR*)bh->b_data這個強制轉(zhuǎn)換。其實bh->b_data就是引導(dǎo)扇區(qū)在內(nèi)存中的鏡像的地址,這個轉(zhuǎn)換就是說NTFS_BOOT_SECTOR這個結(jié)構(gòu)體就是這塊內(nèi)存的解析方法。
這就提供了一個思路,NTFS分區(qū)有數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)體現(xiàn)在結(jié)構(gòu)體上,了解這些結(jié)構(gòu)體的使用就了解了這個文件系統(tǒng)的邏輯。
當(dāng)然,這是在我們沒有任何資料的情況下笨而有效的方法。
這些與layout對應(yīng)的結(jié)構(gòu)體都在kernel/fs/ntfs/layout.h里面,分區(qū)內(nèi)所有數(shù)據(jù)都可以在這里找到對應(yīng)的結(jié)構(gòu)體或成員來表示。
NTFS_BOOT_SECTOR
這個結(jié)構(gòu)體相當(dāng)于引導(dǎo)扇區(qū)的內(nèi)容解析表,比如sle64 mft_lcn就表示這個扇區(qū)0x2C偏移的位置存儲的是MFT(淺嘗輒止84-NTFS文件系統(tǒng)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
每扇區(qū)字節(jié)數(shù)(磁盤硬件決定的) -
u8 sectors_per_cluster
每簇扇區(qū)數(shù)
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;