摘要:FAT32是計算機用戶廣泛使用的一種文件系統模式。該文在分析了FAT32模式下磁盤文件存儲特點的基礎上,提出了一個不依賴于操作系統的直接讀取磁盤文件的系統設計方法,并實現了磁盤文件讀取器的設計。
關鍵詞:FAT32;MBR;文件系統;設計
中圖分類號:TP334文獻標識碼:A文章編號:1009-3044(2009)24-6760-02
Design of Document-Reader Based on FAT32 File System
ZHU Zuo-fu
(Department of Information Engineering, Xuzhou College of Industrial Technology, Xuzhou 221006, China)
Abstract: FAT32 file system model has been extensive used by computer users .This paper gives a design methodology about direct reading disk file system which does not rely on the operating system based on analyzing the characteristics of the FAT32 disk file storage mode ,and realizes the design of document-reader.
Key words: FAT32; MBR; file system; design
計算機中的文件管理是通過操作系統進行的,不同的操作系統通過各自不同的模式來分類管理計算機磁盤中的文件,因此,當計算機的操作系統遭到攻擊并損壞后,用戶就無法進行正常的文件讀取工作,特別對一些重要的文件信息,由于無法進行讀取,可能會對用戶的工作帶來影響。本文根據目前計算機用戶中主流的FAT32模式文件系統的特點,設計了一種脫離操作系統的讀取磁盤文件的讀取器,在實際工作中能夠給部分計算機用戶的工作帶來便利。
1 磁盤文件讀取器的設計原理
FAT32是目前計算機用戶廣泛使用的一種文件系統,在FAT32模式下,一個計算機的硬盤通常可以按如下結構描述:從大的方面可以簡單劃分為硬盤主引導分區(MBR)和邏輯盤兩個部分,對于每一個邏輯盤,又由引導區(BOOT)、系統保留扇區、2個文件分配表(FAT表)和數據區(DATA區)組成,而在數據區中還要有存放文件目錄的根目錄區(ROOT區)。所以,要想讀取一個文件信息,就必須從MBR中找到所屬邏輯盤的位置,然后通過計算邏輯盤引導區、FAT表所占用的空間計算出DATA區中根目錄區的起始地址ROOT,在此基礎上找到文件存放的第一簇的地址并以此構造文件動態存放的簇鏈,讀取相關信息。
1.1 FAT32模式下的硬盤及MBR結構
1)FAT32模式下的硬盤結構
要設計一個在硬盤上查找文件的系統,確定邏輯磁盤的起始地址是讀取磁盤文件的第一步工作。首先我們要了解FAT32模式下的硬盤結構,它由兩個部分組成,一是主引導區MBR,二是邏輯磁盤,如圖1所示。
2)FAT32模式下的硬盤MBR結構
主引導區MBR,全稱為Master Boot Record,即硬盤的主引導記錄。引導扇區是每個分區(Partition)的第一扇區,而主引導扇區是硬盤的第一扇區。它由三個部分組成,主引導記錄MBR、硬盤分區表DPT和硬盤有效標志。在總共512字節的主引導扇區里MBR占446個字節(偏移0--偏移1BDH),DPT占64個字節(偏移1BEH--偏移1FDH),最后兩個字節“55AA”(偏移1FEH--偏移1FFH)是硬盤有效標志。MBR中,偏移地址01BEH--01FDH的64個字節,為4個分區項內容(分區信息表)。它是由磁盤介質類型及用戶在使用FDISK定義分區說確定的。在實際應用中,FDISK對一個磁盤劃分的主分區可少于4個,但最多不超過4個。每個分區表的項目是16個字節,其內容含義如表1所示。
在MBR中每一個16字節的分區表按如下方式分配:
00H 分區標志位80H表示可自舉分區(00H表示非自舉分區)
01-03H起始磁頭號、扇區號、柱面號
04H 系統標志位
05-07H終止磁頭號、扇區號、柱面號
08-0BH相對扇區數
0C-0FH總扇區數
根據上述結構信息,我們就可以確定硬盤上一個邏輯磁盤的起始地址信息,為讀取文件打下基礎。
1.2 FAT32模式邏輯盤結構及相關參數
在確定邏輯盤的起始位置之后,我們要找到文件所在邏輯盤的根目錄區和文件起始簇的位置,才能夠去讀取文件。所以要了解在FAT32模式下,每一個邏輯盤的結構。如圖2所示:
1)BOOT區部分讀寫參數及地址分配
BOOT區部分讀寫參數占用扇區偏移地址03H-59H,具體分配如下:
0BH(2)每個扇區的字節數
0DH(1)每簇扇區數
0EH(2)操作系統保留的扇區數
10H(1)FAT表的個數
18H(2)每個磁道的扇區數
1AH(2)磁盤的磁頭個數
1CH(4)分區前的隱藏扇區數
24H(4)每個FAT表占用的扇區數
2CH(4)磁盤根目錄的起始簇號
2)ROOT區32BIT的分配
在ROOT區中有幾個讀取文件的重要參數(32位中的偏移),地址分配如下:
00-07H文件名的前8個字符
08-0AH文件的擴展名
1A-1BH文件起始簇號的低16位
14-15H文件起始簇號的高16位
2 磁盤文件讀取器的設計
2.1 FAT32文件系統下文件讀取程序的設計思想
FAT32文件系統實際上就是用32位數據來描述磁盤簇的分配,從操作系統的結構上進行分析,可以知道FAT32文件系統并非僅僅簡單地將FAT表轉換成32位(即用4個字節來描述一個簇),而是帶來了磁盤I/O參數、分區和FDT表及文件系統其它方面的變化。在FAT32模式的文件系統中,查找硬盤上一邏輯盤根目錄下的某一文件,必須先做以下工作:
1)找邏輯盤的起始位置、文件根目錄區的起始位置、文件存放的起始簇。
2)構造ROOT存放的簇鏈。
3)構造文件存放的簇鏈。
4)分扇區讀取文件
需要說明的是,文件系統對數據區的存儲空間是按簇進行劃分和管理的,簇是空間分配和回收的基本單位。
2.2 讀取磁盤文件的程序流程
以查找C盤根目錄下一文件為例,讀取文件的流程如圖3所示。
2.3 主要模塊設計
1)邏輯盤地址信息
struct DISKADDPACKET
{
char packetsize;
char reserved;
unsigned int blockcount;
unsigned int bufferaddr[2];
unsigned long blocknum[2];
};
2)調用 int13 讀取扇區函數
getsect(int drive,unsigned long sectnohi,unsigned long sectnolo,char *buff)
{
structDISKADDPACKET diskaddpacket;
unionREGS inregs,outregs;(下轉第6764頁)
(上接第6761頁)
structSREGS segregs;
segread(segregs);
diskaddpacket.packetsize=16;
diskaddpacket.reserved=0;
diskaddpacket.blockcount=1;
diskaddpacket.bufferaddr[0]=(unsigned)FP_OFF(buff);
diskaddpacket.bufferaddr[1]=(unsigned)FP_SEG(buff);
diskaddpacket.blocknum[1]=sectnohi;
diskaddpacket.blocknum[0]=sectnolo;
inregs.h.ah=0x42;
inregs.h.dl=drive;
inregs.x.si=(unsigned)MK_FP(segregs.ds,diskaddpacket);
int86x(0x13,inregs,outregs,segregs);
return;
}
3 結束語
在設計文件讀取器的過程中,由于程序是調用INT13中斷實現的 ,其中較困難的是如何正確調用INT13。此外FAT32模式下ROOT區只有第一簇是固定的,其余簇是動態分配的,ROOT存放簇鏈的構造必須正確。此外,程序中所使用的關鍵變量必須正確定義其存儲類型,ROOT區存放簇鏈和文件存放簇鏈的結束標志必須正確確認,只有這樣才能正確進行文件的讀取。本設計實現了不依賴操作系統的磁盤文件的讀取,可以為廣大計算機用戶的工作提供幫助。
參考文獻:
[1] 劉騰紅.操作系統[M].北京:中國鐵道出版社,2008:121-142.
[2] 張堯學.計算機操作系統教程[M].北京:清華大學出版社,2006:196-212.
[3] 趙林明,王艷霞.對FAT32和FAT16文件系統下BOOT、FAT、 ROOT、DATA區的分析[J].華南金融電腦,2002(4).