fat12檔案系統之資料儲存方式詳解
位址是:
同時,也編寫了乙個簡單的引導程式來驗證了這個引導扇區的資料結構,詳情:
位址是:
下面我們來詳細了解一下fat檔案分配表、根目錄、使用者資料的資料結構,只有通過詳細分析這些資料結構,才能自由的訪問fat12格式的磁碟檔案。
我們先來看看檔案分配表的資料格式,檔案分配表所在的扇區應該是(隱藏扇區+保留扇區)=0+1=第1扇區處,從第1扇區開起到第9扇區結束,第乙個檔案分配表共占用9個扇區,第二個檔案分配表從第10個扇區開始到第18扇區結束,在引導扇區的資料結構中明明確的指出了這些位置。
檔案分配表資料結構如下圖所示:
在fat表開始扇區的第1位元組是儲存介質,0f0h代表軟盤,0f8代表硬碟;第2、3這兩個位元組都是0ffh,代表了fat檔案分配表識別符號,從第四個位元組開始與使用者資料區所有的簇一一對應,應該注意的是,使用者資料區的第乙個簇的序號是002,而不是000,因為儲存介質和識別符號占用了這兩個序號。
在fat12格式中用12位元位來代表乙個簇的序號,我們知道,每個位元組有8位位元,所以每個簇要占用1.5個位元組,也就是說,占用了第1位元組和第2位元組的一半才能表示乙個簇的序號,半位元組的拆分辦法按照下圖的方式進行:
例如:在fat表中開始位置儲存的位元組內容依次是f0 ff ff ff 4f00 05 f0ff,前面三個位元組是儲存介質和識別符號,我們不管它,前面三個位元組占用了0和1這兩個簇序號,那麼就應該從2簇開始了。經過轉換得到的簇序號是:0fffh004h 005h 0fffh,簇號是12位位元,第4位元組(11111111)的作為第2簇號的低8位(0-7),第5位元組(4f)的低4位(1111)作為第2簇號的高4位(8-11),這樣就得到了第2簇號的內容為0fffh;然後第5位元組的高4位(0100)作為第3簇號的低4位(0-3),第6位元組(00000000)作為第3簇號的高8位(4-11),這樣便得到了第3簇號的內容為004h;第7位元組(00000101)作為第4簇號的低8位(0-7),第8位元組的低4位(0000)作為第4簇號的高4位(8-11),這樣可以得到第4簇號的內容為005h;第8位元組的高4位(1111)作為第5簇號的低4位(0-3),第9位元組(11111111)作為第5簇號的高8位(4-11),這樣得到第5簇號的內容為0fffh。
這裡敘述得非常的繁瑣,實際情形是,用彙編來讀取雙位元組(16位),然後執行and或右移操作就可以得到相應的簇號,非常的簡便,後文會講述到,從這裡可以清楚,使用彙編來操作位元組或位,非常的簡單和功能強大。
最終我們得到了這4個簇號的內容,內容是0ff0-0ff7h代表壞簇,磁軌或柱面損壞不可使用,在格式式磁碟時由系統自動填充;內容是0ff8-0fffh代表檔案內容結束,到此簇為止;其它的值代表著下乙個簇號,接著我們分析一下剛才得到的那4個簇號的內容代表的意義,第2簇號的內容是0fffh,代表這個檔案只占用了第2簇,檔案的大小在512b(每簇1扇區512位元組)之內。第3簇號的內容是004h,代表它的下乙個簇是第4簇;第4簇號的內容是005h,代表它的下乙個簇是第5簇,第5簇號的內容是0fffh,代表檔案內容結束,所以這個檔案應該是從第3簇開始到第5簇結束,佔據了3簇的空間,檔案大小在1536b(每簇1扇區512位元組)之內。
這種在簇號內容中儲存下乙個簇號的儲存方式稱為簇鏈,從檔案目錄項中查詢到檔案的首簇號,再在fat檔案分配表中查詢對應的下乙個簇號內容,直到它的內容是0fffh為止,就可以得到整個檔案占用的所有簇空間。
檔案目錄項最開始位於扇區19(隱藏隱藏+保留扇區+fat檔案分配表占用扇區=0+1+9+9)處,它一共占用了14個扇區的空間,在引導扇區的資料結構中偏移17處的字段bpb_rootentcnt指出了最大根目錄數,在fat12中的預設值是224,每個檔案目錄項占用了32位元組的空間,那麼共占用224*32/512=14扇區。
檔案目錄項的32位元組資料結構如下圖所示:
每個檔案目錄項的長度是32位元組,偏移0處的8位元組長的檔名,必須是大寫的ascii字串,不足8位元組就以空格(20h)來填充,接著是3位元組長的檔案字尾名,同樣是大寫的ascii字串,不足3位元組以空格填充。如果檔名的第1位元組是0e5h表示此檔案已經刪除,第1位元組是0表示此目錄項可用。
位於偏移11處的是檔案屬性,使用位元位來設定值:
00000000:普通檔案,可隨意讀寫
00000001:唯讀檔案,不可改寫
00000010:隱藏檔案,瀏覽檔案時隱藏列表
00000100:系統檔案,刪除的時候會有提示
00001000:卷標,作為磁碟的卷識別符號
00010000:目錄檔案,此檔案是乙個子目錄,它的內容就是此目錄下的所有檔案目錄項
00100000:歸檔檔案
檔案的屬性可以疊加使用,可以具有多重屬性,即設定為唯讀的時候也可以同時隱藏。
偏移12處的共10位元組長的內容沒有使用,保留。
偏移22處的是雙位元組長的檔案最後修改時間,使用的方式是分位壓縮儲存方式,兩個位元組共16位從高到低分別儲存時分秒的數值,其中時占用5位(11-15),值從0-23,代表小時;分占用6位(5-10),值從0-59,代表分鐘;秒占用5位(0-4),值為0-29,它的倍數(值*2)就得到秒數。
偏移24處的是雙位元組長的檔案最後修改日期,使用的方式是分位壓縮儲存方式,兩個位元組共16位從高到低分別儲存年月日的數值,其中年占用7位(9-15),值從0-199,此值加上1980就可以得到年份,代表從1980到2023年;月占用4位(5-8),值從1-12,代表月份;日占用5位(0-4),值從1-31,代表當月天數。
位於偏移26處的是雙位元組長的檔案首簇號,利用此值就可以得到檔案內容占用的第乙個簇,然後在檔案分配表中就可以得到所有的檔案簇了。
最後位於偏移28處的雙字(4b)長的檔案長度(位元組)值。
以上據說的扇區都是邏輯扇區,而通過bios讀取的扇區都是使用chs引數int13h功能實現的,邏輯扇區轉換成磁碟chs引數的計算方式如下所示:
根目錄所佔扇區數=最大根目錄檔案數*32/每扇區位元組數
注意,在fat12中:0e0h*32/512=14
使用者資料區起始扇區=隱藏扇區+保留扇區+fat表數*fat表所佔扇區+根目錄所佔扇區
注意,在fat12中:0+1+2*9+14=33
簇起始線性扇區=使用者資料區起始扇區+(簇號-2)*每簇所佔扇區-1
例如:第2號簇的起始線性扇區=33+(2-2)*1-1=32,而第6號簇的起始線性扇區=33+(6-2)*1-1=36
這樣我們便可以得到具體簇號所在的起始線性扇區了,將線性扇區轉換為磁碟chs引數如下所示:
扇區=線性扇區mod 每磁軌扇區數+1
注意:mod為整除取模(餘數);如:32 mod 18+1=14+1=15
磁軌=線性扇區/每磁軌扇區數/磁頭數
注意:除法為取整,在fat12預設情況中,每磁軌扇區數為18,磁頭數為2;如:32/18/2=1/2=0
磁頭=(線性扇區/每磁軌扇區數) mod 磁頭數
注意:除法為取整,mod為整除取模;如:(32/18) mod 2=1 mod 2=1
在檔案根目錄項和fat檔案分配表中得到具體的簇號後就可以根據上面的公式計算出磁碟chs引數後,就可以通過bios的int13h功能來進行讀取扇區內容的操作了。在後文中,將編寫乙個能夠讀取fat12格式下的乙個子目錄中的引導載入檔案到記憶體中,以驗證這篇文章的有效性,敬。
附錄(小知識):系統如何檢測檔案系統是fat12還是fat16?或者fat32?
千萬不要依靠引導扇區資料結構中的bs_filesystype欄位(在fat12中位於偏移54處)來比較這個字串,很多時候這個欄位很不準確,或許壓根就沒有(全是0或空格20h),這個字段存在與否或內容是什麼,與檔案系統一點關係也沒有,採取什麼樣的檔案系統只有乙個計算標準:此卷所有簇的數量。
簇總數=(邏輯扇區總數-(隱藏扇區+保留扇區+fat表數*fat表所占用扇區+根目錄所占用扇區))/每簇扇區數
注:邏輯扇區總數字於引導扇區資料結構偏移19處(欄位bpb_totsec16,長度為2位元組)或32處(欄位bpb_totsec32,長度為4位元組),例如,在fat12預設值中:(2880-(0+1+2*9+14))/1=2847
卷中簇的總數小於4085的為fat12,總數大於或等於4085並且小於65525的為fat16,總數大於或等於65525的為fat32。這就是microsoft作業系統認可的區分檔案系統的標準,必須遵循此標準來操作磁碟卷,否則,microsoft的作業系統將認為此卷損壞導致不可使用。
原文出在:
FAT12檔案系統總結
一 fat12 檔案系統 12位檔案分配表 檔案系統 邏輯層,不關心物理的儲存位置,將資料快抽象成線性的可隨機訪問的,從0開始的陣列 二 層次 扇區 最小單元,512位元組 引導扇區 0扇區 bpb biso paremeter block 簇 資料區儲存檔案資料的基本單位,包含乙個或多個扇區,2的...
檔案系統 FAT12
fat12是dos時代使用的檔案系統,適用於軟盤等小容量儲存介質。其特點 小容量,最大為4.1mb 以簇為單位,最大簇數4084 每個fat表項佔12bits,所以稱之為fat12 每個扇區預設512位元組 根據容量不同,每個簇有1至4個扇區。fat表2 如果存在 是fat表1的備份。根目錄最多包涵...
軟盤與FAT12檔案系統的組織格式
根據 orange s 第4章理解。軟盤的檔案組織格式為fat12,組織單位由大到小分為分割槽 簇 乙個或多個扇區 和扇區 磁碟上的最小資料單元 對於1.44m的軟盤有2面 磁頭號為0和1 每面有80個磁軌 0 79 每個磁軌有18個扇區 1 18 每個扇區有512位元組,共有1474569位元組 ...