第5課 - 主引導程序的擴展(下)
第5課 - 主引導程序的擴展(下)
1. 在 FAT12 根目錄中查找目標文件
在前面課程的學習中,我們知道主引導程序有一個 512 字節的限制,如何突破這種限制呢?我們想到的辦法是:再寫一個程序(LOADER)放到存儲介質中,在主引導程序中將該程序加載到內存中,並將控制權轉交給該程序(jump)。
那如何找到存儲介質中的程序(LOADER)呢?答案就是需要借助一個文件系統(FAT12),將該程序放到軟盤中(軟盤的文件系統格式是 FAT12),根據文件系統數據組織的方式便能方便的找到這個程序。那如何具體的實現呢,請看本節。
1.1 根目錄區的大小和位置
其中:BPB_RootEntCnt
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課 - 主引導程序的擴展(下)