基本上,在我整理的這一系列文章裡面,主要討論的目標是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 |
這裡,你想調用第二磁簇的位置,你看到了下一個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 件のコメント:
コメントを投稿