SyntaxHighlighter

2013-06-09

3.5吋軟碟片FAT磁區解析-part.3 檔案分割表

第三章 檔案分割表File Allocation Table (FAT)

基本上,在我整理的這一系列文章裡面,主要討論的目標是FAT12
為什麼叫FAT12呢?
對檔案系統有點認識的人,就知道除了FAT12之外,最常聽到的FAT格式就是FAT16跟FAT32

12/16/32是在說什麼呢?他是指一個FAT佔了多少位元(bit)
沒錯,你沒看錯,是位元而不是位元組
而大家都知道,一個位元組佔了8位元
也就是說,除了FAT12以外,其他的FAT都可以直接讀取/寫入整個位元組來確認磁區位置,只有FAT12這傢伙很難處理



在這裡,要先說明FAT格式下如何取得檔案內容
Step1. 前往根目錄磁區取得檔案的第一磁簇位置
Step2. 取得被標示在第一磁簇位置的二次元檔案內容
Step3. 前往FAT確認下一個磁簇位置
Step4. 取得下一個磁簇位置的二次元內容
Step5. 重覆Step3~4,直到下一個磁簇位置被標示為檔案結尾

由於FAT12用12bit來表示一個磁簇位置,所以通常一個磁簇的內容會是下表的其中一個內容
entry content說明
0x000空白
0x001內部用途保留。由於通常資料都是由第二磁簇開始的,應該是不會用到1號磁簇。
0x002-0xFEF下一個磁簇的位置
0xFF7損壞磁簇
0xFF8-0xFFF檔案結束
未列出的就是保留用的。


很好,你看到了Step3的地方要到FAT取得下一個磁簇位置。
我們調用某個磁碟的第一FAT的前32byte(16 Chars)如下
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
F0 FF FF 03 40 00 05 60 00 07 80 00 09 A0 00 0B
前12bit 它是0xf0 + 0xf。表示它是2HD的1440KiB的軟碟。12bit的餘下4bit通常會被填入1 第二組,必須是0xfff。
這裡,你想調用第二磁簇的位置,你看到了下一個byte。
什麼鬼?0x034?
喔,不對不對,它是0x003。因為一般的86機是little-endian,所以下面的byte要放到上面來。如果你用的程式剛好可以讀寫一個bit,那當然沒問題
問題在於,通常的程式都是一次讀寫一個byte,也就是說,你一定會讀到8的倍數的bit數
像是這個部分,你必須讀出六個byte分成上下兩部分,分別是0xff,0x0f跟0xf0,0xff
因為他們的bit剛好是 11111111 | 11110000 跟 00001111 | 11111111

...我寫到這裡已經很火大了,因為取得一個簇的時候要分成奇偶數
當是偶數的時候,起始byte位置(從0開始) = 想取得簇數cluster * 3 / 2
當是奇數的時候,起始byte位置(從0開始) = (想取得簇數cluster * 3 - 1) / 2

讀取的時候還好,只需要取得起始位置開始2byte, 然後依照奇偶數進行交集(AND)位元運算。
偶數時,0xff 0x0f
奇數時,0xf0 0xff

寫入的時候就痛苦了,必須先讀出原始位置中重覆的那一個byte,把原始的4bit寫進將要寫入的byte上,然後再寫回FAT表...
好慘...我要寫個慘字

0 件のコメント:

人気の投稿