1. 程式人生 > >第5課 - 主引導程序的擴展(下)

第5課 - 主引導程序的擴展(下)

大於等於 介紹 整理 3.2 分享圖片 ... ntc 課程 width

第5課 - 主引導程序的擴展(下)

1. 在 FAT12 根目錄中查找目標文件

  在前面課程的學習中,我們知道主引導程序有一個 512 字節的限制,如何突破這種限制呢?我們想到的辦法是:再寫一個程序(LOADER)放到存儲介質中,在主引導程序中將該程序加載到內存中,並將控制權轉交給該程序(jump)。

  那如何找到存儲介質中的程序(LOADER)呢?答案就是需要借助一個文件系統(FAT12),將該程序放到軟盤中(軟盤的文件系統格式是 FAT12),根據文件系統數據組織的方式便能方便的找到這個程序。那如何具體的實現呢,請看本節。

1.1 根目錄區的大小和位置

  技術分享圖片

    其中BPB_RootEntCnt

表示最大根目錄文件數(即最大目錄項的個數,默認是 0xE0,224

        RootEntry 表示根目錄區每個目錄項的大小(32 Bytes

        BPB_BytsPerSec 表示每扇區的字節數(512 Bytes

        224 * 32 = 7168 B 7168/512 = 14扇區

  技術分享圖片

1.2 FAT12 文件系統中的根目錄區

  根目錄區由目錄項構成,每一個目錄項代表根目錄中的一個文件索引。

  技術分享圖片

  在 FAT12 中,1簇 = 1扇區

  目錄項中的關鍵成員:

    • DIR_Name

        文件名(用於判斷是否為目標文件)

    • DIR_FstClus

        文件數據起始存儲位置(用於確定讀取位置)

    • DIR_FileSize

        文件大小(用於確定讀取的字節數)

1.3 實驗:讀取 FAT12 文件系統的根目錄信息

  — 步驟:

    • 創建 RootEntry 結構體類型
    • 使用文件流順序讀取每個項的內容
    • 解析並打印相關的信息  

2. 介紹 FAT 表

2.1 FAT 表 - FAT12 的數據組織核心

  (1)FAT1 和 FAT2 是相互備份的關系,數據內容完全一致

  (2)FAT 表是一個關系圖,記錄了文件數據的先後關系

  (3)每一個 FAT 表項占用 12 比特

  (4)FAT 表的前 2 個表項規定不使用

2.2 FAT 表中的先後關系

  (1)以簇(扇區)為單位存儲文件數據

  (2)每個表項( vec[i] )表示文件數據的實際位置(簇)

    • DIR_FstClus 表示文件第 0 簇(扇區)的位置
    • vec[DIR_FstClus] 表示文件第 1 簇(扇區)的位置
    • vec[vec[DIR_FstClus]] 表示文件第 2 簇(扇區)的位置
    • ......

2.3 FAT12 數據物理組織示意

  技術分享圖片

2.4 FAT12 數據邏輯組織示意

  技術分享圖片

2.5 實驗:加載 FAT12 中的文件數據

  — 步驟:

    • 在根目錄區查找目標文件對應的項
    • 獲取目標文件的起始簇號和文件大小
    • 根據 FAT 表中記錄的邏輯先後關系讀取數據

3. 小貼士

3.1 小貼士一

  (1)FAT 表中的每個表項只占用 12 比特(1.5字節)

  (2)FAT 表一共記錄了 BPB_BytsPerSec * 9 * 2 / 3 個表項

  (3)可以使用一個 short 表示一個表項的值

  (4)如果表象值大於等於 0xFF8 ,則說明已經到達最後一個簇

  (5)如果表項值等於 0xFF7 ,則說明當前簇已經損壞

3.2 小貼士二

  (1)數據區起始簇()號為33,地址為 0x4200

  (2)數據區起始地址所對應的編號為 2(不為 0)

  (3)因此,DIR_FstClus 對應的地址為:

    • 0x4200 + ( DIR_FstClus - 2 ) * 512

編程實驗:讀取指定文件內容】

4. 小結

  (1)FAT12 根目錄區記錄了文件的起始簇號長度

  (2)通過查找根目錄區能夠確定是否存在目標文件

  (3)FAT12 文件數據的組織使用了單鏈表的思想

      文件數據離散的分布於存儲介質中

      文件數據通過 FAT 項進行關聯

註:本文整理於《狄泰12月提升計劃》課程內容

狄泰QQ群:199546072

本人QQ號:502218614

第5課 - 主引導程序的擴展(下)