淺嘗輒止85-NTFS文件系統(tǒng)1-內(nèi)核2-分區(qū)引導(dǎo)扇區(qū)解析

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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容