Board logo

主題: [資訊電機] [問題]請問有詳細介紹FAT儲存格式的書籍嗎? [打印本頁]

發表人: saltire    時間: 2005-11-30 11:16 PM     主題: [問題]請問有詳細介紹FAT儲存格式的書籍嗎?

請問有詳細介紹FAT儲存格式的書籍嗎?
像硬碟或隨身碟或記憶卡
要如何規化才能讓OS正常讀取之類的!
發表人: AGC    時間: 2005-12-1 01:27 AM

據我所知 FAT12,16 格式是公開的,FAT32,MS則保密,不過原理應該與16差不多。

你是要以下的資料??

BOOT SECTOR 記錄

偏移值 資料大小 說明
00H 3位元組 跳址指令(V5版為EB3C90H)。
3∼0AH 8位元組 系統名稱。
0BH以後為BPB資料:
0BH+00H 2位元組 每磁區之位元組數(內定為0200H)。
0BH+02H 位元組 每磁簇之磁區數。
0BH+03H 2位元組 由磁區0開始的保留磁區數。
0BH+05H 位元組 FAT個數(內定為02)。
0BH+06H 2位元組 根目錄登錄總數。
0BH+08H 2位元組 磁區總數(大於65535則此值為0)。
0BH+0AH 位元組 媒質指示。
0BH+0BH 2位元組 每一FAT所佔之磁區數。
0BH+0DH 2位元組 每磁軌之磁區數。
0BH+0FH 2位元組 磁頭數。
0BH+11H 4位元組 隱藏磁區數(內定為0)。
0BH+15H 4位元組 若8H=0則為磁區總數(內定為0)。
0BH+19H 位元組 實體磁碟機數。
0BH+1AH 位元組 保留。
0BH+1BH 位元組 擴充開機記錄之記名欄。
0BH+1CH 4位元組 由日期時間而得的序列號碼。
0BH+20H 11位元組 版本標記。
0BH+2BH 8位元組 保留(內存FAT型式;為FAT12或FAT16之文字)。

[AGC 在 2005-12-1 01:30 AM 作了最後編輯]
發表人: saltire    時間: 2005-12-1 01:01 PM

請教一下
當硬碟或記憶卡格式化成FAT16或FAT32之後
要如何知道BOOT區和ROOT區和資料區是在哪個位址呢?
發表人: AGC    時間: 2005-12-1 02:15 PM

我猜記憶卡應該沒有分割表吧(和FD同),所以第一個磁區就是BOOT區。
而HD就比較麻煩,因有分割表,所以先要找出每個分割(邏輯磁碟)開始處,才可找到每一個邏輯磁碟的BOOT區。
而ROOT開始處為:
BOOT區+2份FAT表所佔磁區,即可求得,一般一磁區為0.5KB(512BYTES),而BOOT區的下一磁區就是FAT表區。
由上表中可取得每份FAT所佔磁區數(0X0B+0XB處),再乘以(0X0B+0X05)內的值=總FAT所佔空間,這個區域稱磁簇(或叢集)0。
一般FAT16,是用2BYTES記錄磁簇值,所以最大為65535*2=128KB=256個磁區,2份表就512個磁區+1(BOOT區)=513,所以第514起就是ROOT區了,而ROOT佔多少空間,可由"根目錄登錄總數"求出,每一檔名記錄佔32BYTES。
例如 HD 的ROOT,最多為512個,則為 (512*32)/512=32個磁區,這個區域通常稱為磁簇1
以上是SFN方式,LFN比較麻煩了,我記得N年前有一本"HD實戰手冊"(?,要查一下書名),上面有關LFN的說明。
發表人: AGC    時間: 2005-12-1 05:57 PM

書名:
PCDIY98硬碟玩家實戰(旗標,F641),第7章。
有一站,一定喜歡的
http://www.ntfs.com/
之前忘了貼了。

[AGC 在 2005-12-1 08:17 PM 作了最後編輯]
發表人: saltire    時間: 2005-12-5 04:02 PM

請教一下
MBR的位置都是從sector 0開始嗎?
MBR的大小有一定嗎?
分割表 partition table 的位置又在哪呢?
不同硬碟位置也會不同嗎?
有partition table的格式資料嗎?
發表人: AGC    時間: 2005-12-5 06:08 PM

抓這東東回去,見 P.80~83
而分割表的位置及如何看,N年前我也曾經貼過。
如果沒特殊需求,在PC上每一磁區都是512BYTES,RAMDISK可任意指定大小(內定,記得是128BYTES)

[AGC 在 2005-12-5 06:13 PM 作了最後編輯]
發表人: AGC    時間: 2005-12-5 11:02 PM

再貼一次好了。
有關FAT讀檔及處理方式(磁簇值-->磁區值)等,可見我N年前寫的FSRC程式(可在這裡取得)
不過是ASM寫的,不過我沒寫太多的註解,因為我另外寫成筆記的,該程式只是讀出FAT功能,沒有寫入FAT資料。
我忘了當初我取得BOOT內的各項資料是透過DOS CALL還是 INT25H 讀 SEC.0 ,這要查查。

CODE:
[Copy to clipboard]
寄件者:Asc Cpu (newsgate@teatime.lifenet.com.tw)
主旨:DOS磁區和物理磁區的互換問題(解答版)
新聞群組:tw.bbs.comp.language
日期:1998/11/10


DOS絕對磁區換算成物理磁軌、磁面、磁區之算法
───────────────────────

首先介紹本人HD之分割法:
HD1 = C: to P: ( 2.1GB )
HD2 = Q:  ( 120MB )
第一台HD分成C:~P:磁碟,第二台沒分割。

表1~3是HD1的各個磁碟的分割表內量;要算物理磁軌、磁面、磁區所需要
知的有HD的最大每一磁面上的磁區總數值,由表1知為63;每一磁軌的磁面數
(就是磁頭數),由表1知為64,而總磁軌數要不要,則示程式寫作時決定;
再來就是要知保留磁區的值(由 RELATIVE SEC. 欄得知)。

接下來談公式:

A式:
物理磁區值=線性磁區值(註) MOD 每一磁面的磁區總數值
B式:
物理磁面值= INT(線性磁區值/每一磁面的磁區總數值) MOD 每一磁軌的磁面總數值
C式:
物理磁軌值= INT(線性磁區值/(每一磁面的磁區總數值*每一磁軌的磁面總數值))

註:因為要區分物理磁區而取名的,其如何求出的,後述。

OK:現在我要求出在C:之絕對磁區3988,位於HD的何處,則步驟如下:

1、絕對磁區+1+C:的保留磁區值=線性磁區值,為:

      3988+1+63=4052

2、把1步求出的值代入上面的A、B、C三式中得:

    A=4052/63=64餘20,所以 A=20
    B=64/64=1餘0,所以 B=0
    C=1

3、所以位在磁軌1、磁面0、磁區20的地方。(CYLI.=1,SIDE=0,SEC.=20)


表1:
DISK DRIVER= C: & D:+
---------------------------------------------------------------------------
|      |    | Starting Location  |  Ending Location   |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors  | Sectors  |C:
|BIGDOS| Yes|  1       0      1  | 63      60     63  |       63|    245889|D:+
|EXTEND| No |  0      61      1  | 63    1021     63  |   245952|   3874752|
---------------------------------------------------------------------------


表2:
DISK DRIVER= D: & E:+
---------------------------------------------------------------------------
|      |    | Starting Location  |  Ending Location   |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors  | Sectors  |D:
|BIGDOS| No |  1      61      1  | 63     121     63  |       63|    245889|E:+
|EXTEND| No |  0     122      1  | 63     182     63  |   245952|    245952|
---------------------------------------------------------------------------


表3:
DISK DRIVER= E: & F:+
---------------------------------------------------------------------------
|      |    | Starting Location  |  Ending Location   |Relative |Number of |
|System|Boot|Side Cylinder Sector|Side Cylinder Sector|Sectors  | Sectors  |E:
|BIGDOS| No |  1     122      1  | 63     182     63  |       63|    245889|F:+
|EXTEND| No |  0     183      1  | 63     243     63  |   491904|    245952|
---------------------------------------------------------------------------


好,現在要求出E:中絕對磁區77988在何處:

1、由表2的E:+處得之,之前的保留區是245952,再看表3中的E:分割
表內的保留區是63,所以線性磁區值為:

       77988+1+63+245952=324004

2、代入ABC三式得:

      A=324004/63=5142餘58,所以 A=58
      B=5142/64=80餘22,所以 B=22
      C=80

則位於 CYLI.=80,SIDE=22,SEC.=58 處。

好了,說明完了,知到算法之後,你可以把整個邏輯磁碟機 BACK UP 都行了

OK,有問題或有錯的地方可以提出來........

.. THE WAY YOU DO THE THINGS YOU DO/MY GIRL .. (DARYL HALL & JOHN OATES)
--- News Gateway 0.08+
* Origin: TeaTime BBS 886-2-2245-3105 News <=> BBS Gateway (6:720/345.0)
[AGC 在 2005-12-5 11:07 PM 作了最後編輯]
發表人: saltire    時間: 2005-12-6 08:28 AM

有程式是可以在XP下就直接看硬碟內的磁區分佈內容嗎?

還有用LBA來抓資料的話
一次都抓512byte
那如果512byte只有用到一點
那剩下的空間不都浪費掉了嗎?

[saltire 在 2005-12-6 08:47 AM 作了最後編輯]
發表人: AGC    時間: 2005-12-6 11:04 AM

其實不管NTFS,FAT多少的,用NORTON的DISKEDIT(DOS版可),都可看見HD內每磁區的內容(我有試過),這是用INT13H直接取物理磁區出來的,所以HD一定必為BIOS抓到的,像BIOS抓不到,但,要進2000,XP才可用的,則不行(或許在200,XP開DOS BOX,執行DISKEDIT看看,可能可行 )。
第2個問題...是的,但還有磁簇這東東(第2磁簇起,每磁簇的大小見"0BH+02H 位元組 每磁簇之磁區數"該項)
MS的磁碟運作是以"磁簇"為單位存取,所以,以1磁簇=4KB而言,是8磁區,就算你只存1BYTE下去,表面上檔名記錄表內的檔大小是1,實際上,它被佔走了4KB的空間去了,所以我在FSRC程式中也有顯示該檔實際佔用空間值。

[AGC 在 2005-12-6 11:15 AM 作了最後編輯]
發表人: saltire    時間: 2005-12-6 04:51 PM

再問一下
我有一塊32MB的CF卡
想格式化成FAT32
我用電腦管理的磁碟管理來格式化
跑到100%時出現"磁碟區容量太小 不適用於所選取的檔案系統"
然後CF卡依舊是FAT格式
不知道是容量的關係嗎?
還是說一定要超過2G的記憶卡才可以格式化成FAT32?
發表人: AGC    時間: 2005-12-6 06:41 PM

沒玩過FAT32,不過應該是太小了不合乎效能,32MB好像是FAT12的上限
發表人: saltire    時間: 2005-12-7 05:33 PM

我已經知道要超過32MB才可以格式化成FAT32了

現在有了新的問題是
如果我想設計一個嵌入式系統的格式化功能
可以格式化硬碟或記憶卡
有讀寫SECTOR的函數
沒有FORMAT這種函數
但是我抓取資料都是從MBR和BOOT
一旦擦除掉了
不就沒辦法知道儲存體的基本資料(磁碟容量)了嗎?
還是說MBR和BOOT是可以自己建表規化的呢?
發表人: AGC    時間: 2005-12-7 08:08 PM

這我就沒研究了,若找的到以前DOS下的FDISK及FORMAT的原始程式來看就有幫助了

http://www.23cc.com/free-fdisk/
有 FDISK 及 FORMAT 含原碼,剛找的。

[AGC 在 2005-12-7 08:14 PM 作了最後編輯]
發表人: saltire    時間: 2005-12-8 10:40 AM

慘了
我把記憶卡的sector 0 清除掉了
然後在用讀卡機格式化
接著就發生一件事
原本boot sector應該在32才對
現在跑到sector 0了
而原本sector的MBR和PartitionTable都不見了
我試過PARTITION MAGIC了
只讀的到硬碟
讀不到讀卡機的CF卡

這下我該如何是好呢?

[saltire 在 2005-12-8 11:46 AM 作了最後編輯]
發表人: saltire    時間: 2005-12-8 02:13 PM

找了很幾個程式
終於找到了
VAIOSoft Recovery Manager
這軟體可以把隨身碟的磁區內容做備份
也可以把格式化成初始狀態
不過奇怪的是
原廠格式化後的剩餘空間是30.2MB
而用這程式格式化之後變化30.3MB
或許應該要說FDISK的規化和原廠不一樣
也就是說只要不要超過該儲存媒體的最大上限都可以自行規化MBR

現在的疑問還是在沒有MBR的情況下
要如何抓取記憶卡有多少cylinder head sector ?
或是總共的LBA Capacity ?
要如何做格式化成FAT32呢 ?

[saltire 在 2005-12-8 04:16 PM 作了最後編輯]
發表人: AGC    時間: 2005-12-8 10:02 PM

記憶卡只是RAM等組成的,因該沒有磁柱,磁頭等的原設資料,我猜大概與 RAMDISK的規劃方式同吧???
不然就先了解記憶卡的硬體結構,看有沒有類似PC上RAM絛上有一小8PIN IC(那叫什麼... PDS??),可能資料就記在那個EEPROM上。
去"雷兒"吧,那裡人氣比較多。
發表人: saltire    時間: 2005-12-12 11:49 AM

剛剛大概看了一下
CompactFlash Specification Revision 3.0

Information Technology - AT Attachment with Packet Interface - 6 (ATA/ATAPI-6)

IDENTIFY DEVICE Command code 都是 ECh
不過呢
CF有定義CHS數量和容量
numbers of cylinders
numbers of heads
Current sectors per track
capacity in sectors

反倒是ATA沒有定義CHS有多少
真奇怪
到底BIOS是怎麼知道硬碟有多大有多少CHS呢?
發表人: Acute    時間: 2005-12-13 03:43 AM

你問的問題好多, 大概是處理HDD 的新手, 呵
問題其實不難, 但是, 回答起來可能長長一大串,
有些東西, 還是善用google 比較快
因為要敲長長一大串的答案, 也是挺難的 @_@

1. 只要是硬碟, 就會有Identify 資料可讀取, Identify 裡面會記錄磁碟的容量問題
    想要知道Identify 的相關欄位, 請找HDD 廠商的網站, 然後隨便找一個HDD 的datasheet 抓下來
    裡面會詳細介紹:
   A. Identify 欄位名稱/大小/含意
    B. 完整的ATA command set 說明
   C. 現在應該已經沒有人使用Identify 裡面的CHS 了,
       都是使用Total Number of User Addressable Sectors的欄位
    PS: 如果你會需要處理容量超過128G(K=1024), 記得找超過128G 的HDD datasheet
         因為超過128G 以上容量, 需要ATA6 command set
   PS: 超過128G 的HDD, 有時Identify會有其他欄位描述硬碟容量
2. CF 卡其實也是IDE 界面, 所以, 可以把他完全視為HDD
3. memory device 可以有MBR 也可以沒有MBR
    也就是, 程式處理記憶卡時, 要有習慣偵測sector 0 的內容是Boot or MBR
4. FAT12/FAT16/FAT32 詳細資料, MS 的MSDN 網站上可以找到
    FAT12/FAT16 兩個很像, 只是FAT size 不同而已
    FAT32 比較複雜一點點, 多了幾個系統描述的sector需要處理, 但是跟FAT12/16 還是主架構相同
5. Format HDD/CF 程式碼, 可以去網路上找, 應該找得到
6. FAT12/FAT16/FAT32 容量問題, 我記得MSDN 網站的資料上有說明限制各有哪些
    不過, 其實自己算也可以算出來
7. 測試自己寫FAT32 有沒有出錯, 要用98 進行磁碟掃描, XP 掃描都會一律告訴你正確, 但是其實可能你已經漏掉某些系統描述的sector update 行為而不自知
8. Partition Magic format FAT32 時, 他會算錯磁碟容量, 大約少掉一個cluster size, 所以, 如果你自己format 出來比Partition Magic 大一點點, 不要認為自己錯

處理HDD/CF我的經驗是:
1. 一定要花時間弄懂Identify 裡面的欄位用途, 很多時候你會需要它
2. 把ATA command 弄清楚
3. 把FAT12/16/32 資料格式弄清楚
4. 把timing 弄清楚, 呵, 這個常常是真正害死人的兇手
    尤其剛開始, 通常使用PIO 模式, PIO2/3/4 的timing 都不一樣
    當然, 如果你用的uP 很low end, 速度跟龜一樣, 就不用擔心太多timing 問題
    不然, 只要沒仔細啃timing 問題, 就會發生挑卡, 挑硬碟...

其餘的, 大概都不再構成問題, 而上述資料, 就是找HDD datasheet & 去MSDN 網站找FAT 說明

如果你很習慣啃別人程式, 而且可以快速看懂&從中擷取你需要的程式片段
那你可以去找FreeDOS 這個網站, 它是一套DOS 相容的Open Source 系統
從裡面, 你可以看見FAT12/16/32 是如何處理的
不過.... 裡面的程式很大一套, 你要習慣看別人的程式, 才有辦法快速弄懂它在幹嘛
不然, 可能花費的時間會比你啃資料說明還要久
從該網站, 當然也一定可以找到format 程式囉, 呵

Acute.
發表人: saltire    時間: 2005-12-14 11:49 PM

其實我是要用在遷入式系統的!
所以需要很多基本的觀念才行!
目前是買回來的創見CF卡256MB相容性出問題了!
不知為啥Initialize Device時就出現錯誤!
SANDISK的32MB卻沒問題!
但32MB又不能使用FAT32!
唉~~~OTL
發表人: Acute    時間: 2005-12-15 06:25 AM

最大可能性, 就是我說的, timing 錯誤囉
ATA command 對軟體而言, 是永遠一樣的, 而且, 其實就是那幾個command 而已
但是, 硬體的timing 只要不正確, 就會挑硬體

Acute.
發表人: saltire    時間: 2005-12-15 09:59 AM

有個疑惑是
既然不是用CHS來運作的話
假設我已經知道該HD或CF卡的最大容量
CHS是多少並不知道!
而我想要設計自動FDISK HD或CF卡!
並且也格式化成FAT32!
假設最大容量都不超過30GB

先寫入MBR的PARTITION Table
然後再從Absolute First Sector 寫入FAT32的Boot Sector and BPB Structure

如果只知道最大容量是多少就可以規化了是嗎?
發表人: Acute    時間: 2005-12-17 12:11 PM

一般HDD 只要知道total sectors, 就可以格式化沒錯
至於FAT32 32G or 64G 限制, 那是Windows 自己設的限制
250G HDD 自己寫format 程式, 也是可以format 成FAT32 阿, 呵

Boot 習慣上落在Cylinder 的整數位置上, 也就是CHS 裡面的S 的整數倍
對HDD 而言, 這個數值是固定的63, 有些記憶卡可能是31
有沒有按照這個舊傳統放置Boot 只會影響還在使用CHS 方式驅動HDD 的老系統

Format FAT32 的程序大概就是:
1. 寫MBR (LBA 0)
2. 寫Boot (LBA 63)
3. 寫Backup Boot Sector & System Info. Sector
    (LBA 63+x, 沒有規定位置, Boot 內要設pointer)
4. FAT1/FAT2 全部清除, 寫入Root 位置
5. 產生Root
FAT12/FAT16 少掉步驟三 & Root 位置, Root Size 固定, 其餘都一樣了

Acute.
發表人: toto    時間: 2005-12-17 12:16 PM


引用:
Acute寫到:
一般HDD 只要知道total sectors, 就可以格式化沒錯
至於FAT32 32G or 64G 限制, 那是Windows 自己設的限制
250G HDD 自己寫format 程式, 也是可以format 成FAT32 阿, 呵

Boot 習慣上落在Cylinder 的整數位置上, 也就是CHS 裡面的S 的整數倍
對HDD 而言, 這個數值是固定的63, 有些記憶卡可能是31
有沒有按照這個舊傳統放置Boot 只會影響還在使用CHS 方式驅動HDD 的老系統

Format FAT32 的程序大概就是:
1. 寫MBR (LBA 0)
2. 寫Boot (LBA 63)
3. 寫Backup Boot Sector & System Info. Sector
    (LBA 63+x, 沒有規定位置, Boot 內要設pointer)
4. FAT1/FAT2 全部清除, 寫入Root 位置
5. 產生Root
FAT12/FAT16 少掉步驟三 & Root 位置, Root Size 固定, 其餘都一樣了

Acute.


想不到阿Q也這麼厲害呀...


發表人: saltire    時間: 2005-12-18 08:08 PM

設計流程我大概知道了

可是我還是不解
只知道最大容量
那要如何設計FAT32的BOOT SECTOR的PBP資料呢?
發表人: Acute    時間: 2005-12-22 06:55 PM

你是說, 類似sectors per cluster ?
那是軟體決定的阿, 跟硬體一點關係都沒有

Acute.
發表人: saltire    時間: 2005-12-23 10:04 AM

那就是說
我在寫FDISK時可以隨便設定嗎?
如果是這樣那還要PBP做啥?
發表人: Acute    時間: 2005-12-23 06:28 PM


引用:
saltire寫到:
那就是說
我在寫FDISK時可以隨便設定嗎?
如果是這樣那還要PBP做啥?

如果你弄出的硬碟只有你用, 當然不寫也行
不然, 別人的程式如何知道你弄成啥樣子呢?

Acute.
發表人: saltire    時間: 2005-12-27 05:49 PM

在設計FAT32的BOOT SECTOR時
BPB_FATSz16設為0
那BPB_FATSz32該如何設計呢?
發表人: saltire    時間: 2005-12-29 02:03 PM

假設我的硬碟是Hitachi 30GB
Identify_Device_Information為
Cylinder=3FFFh(16383)
Head=10h(16)
Sector_per_track=3Fh(63)
Capacity_CHS=FBFC10h(16514064)
Capacity_LBA=037E3E40h(58605120)

而我現在要設計成會自動FDISK成一個FAT32磁碟槽

~MBR~
BootIndicator:80
StartHead:01
StartSectorCylinder:0100
SystemID:0C or OB
EndHead:??
EndSectCylinder:????
AbsoluteFirstSect:????????(3F或20???)
Nbsect:????????

~BootSector~
BS_jmpBoot:EB3C90
BS_OEMName:MSDOS5.0
BPB_BytsPerSec:0002(512byte)
BPB_SecPerClus:??(1~128)
BPB_RsvdSecCnt:2000(32)
BPB_NumFATs:02
BPB_RootEntCnt:0000
BPB_TotSec16:0000
BPB_Media:F8
BPB_FATSz16:0000
BPB_SecPerTrk:3F00
BPB_NumHeads:FF00
BPB_HiddSec:20000000
BPB_TotSec32:同MBR.Nbsect
BPB_FATSz32:????????
BPB_ExtFlags:0000
BPB_FSVer:0000
BPB_RootClus:02000000
BPB_FSInfo:0100
BPB_BkBootSec:0600
BPB_Reserved:000000000000000000000000
BS_DrvNum:80
BS_Reserved1:00
BS_BootSig:29
BS_VolID:????????
BS_VolLab:NO NAME
BS_FilSysType:FAT32

想請教以上??的欄位要如何計算出來呢?
發表人: Acute    時間: 2005-12-29 09:02 PM

~MBR~
BootIndicator:80
StartHead:01
StartSectorCylinder:0100
SystemID:0C or OB  (這個根據File system 而決定ID)
EndHead:??         (這個對使用LBA 的系統沒有影響, 呵, 不然, 就一定得知道CHS)
EndSectCylinder:????   (同上)
AbsoluteFirstSect:????????(3F或20???)   (一般可以固定使用3F)
Nbsect:????????                        ( 這個是total sector, LBA 系統使用這個)

~BootSector~
BS_jmpBoot:EB3C90            (這是程式碼, 並非固定值, 呵)
BS_OEMName:MSDOS5.0          (這個其實你高興填TWED2K 也沒人管你)
BPB_BytsPerSec:0002(512byte) (這是固定值)
BPB_SecPerClus:??(1~128)     (這就是cluster size 阿, 一般可以直接暴力使用32K, 但是要計算, 使用32K 會不會牴觸FATxx 限制)
BPB_RsvdSecCnt:2000(32)      (這個沒有強制規定, 可以看別人怎樣做就照做)
BPB_NumFATs:02               (這是固定值, 但是, 真的弄成1 也行)
BPB_RootEntCnt:0000          (我記得這個FAT12/16 才有吧... )
BPB_TotSec16:0000            (當Sectors 數目超過0xFFFF 就填FFFF 然後用後面32 bits 數值)
BPB_Media:F8                 (這個當固定值處理即可)
BPB_FATSz16:0000             (不知道你寫啥噎, 我猜是FAT size 吧!, 當FAT size 超過65535 個sectors 就填65535)
BPB_SecPerTrk:3F00           (CHS 用的, 其實已經沒價值)
BPB_NumHeads:FF00            (CHS 用的, 其實已經沒價值)
BPB_HiddSec:20000000         (這個也是沒規定, 通常跟reserved sectors 用來把空間擠到最後面)
BPB_TotSec32:同MBR.Nbsect    (就是Total Sectors 囉, 當超過65535 就是使用這個)
BPB_FATSz32:????????         (不知道你寫啥噎, 我猜是FAT size 吧!, 前面超過65535 就靠這兒描述)
BPB_ExtFlags:0000            
BPB_FSVer:0000              
BPB_RootClus:02000000        (這應該FAT32 才有, 位置比照file/folder create rule)
BPB_FSInfo:0100              (這個也是FAT32 才有, 位置自己決定)
BPB_BkBootSec:0600           (同樣FAT32 才有, 位置自己決定)
BPB_Reserved:000000000000000000000000
BS_DrvNum:80                 (這個是啥? 一點印象都沒有, 看數值, 很像DOS 底下的磁碟編號對應的數字, 呵)
BS_Reserved1:00
BS_BootSig:29
BS_VolID:????????           (這是一個亂數)
BS_VolLab:NO NAME           (磁碟標籤名稱, 我記得是8.3 格式, 必須英文)
BS_FilSysType:FAT32         (看是哪一種FAT 格式)

基本上, FDISK 只管MBR 不管Boot, Boot 是format 程式的工作
format 程式根據硬碟容量, 使用一個自己高興的rule 決定cluster size
決定出cluster size 之後, 就可以算出FAT size
然後知道FAT size 之後, 如果是FAT12/16 就需要再決定Root Size, 如果是FAT32 就不管
(Root size 並沒有強制規定是多大, 因為他是被記錄的, 通常可以看別人用多大數值, 照用),
如果是FAT32, 則需要決定Root 的位置, 配置最小單位當然是一個cluster
reserved sectors 至少為2, 因為要存放FSInfo & Backup Boot Sector, 這是FAT32 才有的
FAT size 的計算, 對FAT32 而言, 需要使用64 bits 運算, 才能計算出該算式
當然, 如果你程式技巧夠, 不需要64 bits 也能算出來, 就看你的功力如何了, 呵
至於計算FAT size, 老實說, 只要算出來比實際大, 就OK, 不能比實際小
Partition Magic 一直到7.0 為止, 都會算錯, 會比實際需要大, 哈 (8.0 會不會錯沒去嘗試就是了)
reserved sectors + hidden sectors 通常用來把磁碟使用空間推到最底
也就是, 假設30G 是一個Partition 完成
那你用任何常規程式把硬碟format 完成, 然後把磁碟塞到剛好滿
這時候, 你會發現, 磁碟的最後一個磁軌是被使用的
因為format 程式會計算, 把磁碟使用空間推到底, 至於為啥這樣設計? 我不知道
我自己寫的format 程式就不會幹這種無聊事 ^^"

決定cluster size 只有一個重點, FAT32 算出來的cluster 數目不能小於約64K 個
也就是, 32K*64K = 2G, 所以, 低於2G 的磁碟, format FAT32 時, cluster size 必須小於32K
同樣的, 64K * 512 = 32M, 所以, 32M 的磁碟, format 不出FAT32
這些都是所謂的極限, 極限都是可以推算的, 只要知道限制是啥
限制也很簡單, FATxx 的FAT 數目, 就是2^xx - 8, 這就是限制
(2^xx-8)*cluster size, 就是相對的硬碟尺寸限制
相關問題, 自己手動算一算, 想一想, 就可以懂了, 呵

對了, FAT size 填寫的是sector count, 不是byte 數
所以, 算出實際bytes 數後, 要記得(+511)/512 才能得到sectors
計算式網路上找得到, 不過需要64 bits 運算
因為PC 的compiler 通常都支援64 bits 運算
如果是embedded 系統, 根本不可能有64 bits 運算
這時候, 就看本事了
一種是去網路找64 bits 運算是怎樣計算出來的, 然後把程式碼抄一抄
另一種方式就是使用程式設計的技巧, 就可以用32 bits 算出來, 呵
這部份... 看你對數學了解多少吧
數學越好, 越覺得簡單囉

Acute.

發表人: saltire    時間: 2005-12-29 10:33 PM

使用FAT16時
BPB_FATSz16需計算出來
使用FAT32時
BPB_FATSz16必須設為0
BPB_FATSz32需計算出來

16和32的計算公式似乎不同
我在MS的FAT32白皮書裡都找不到公式

另外SecPerClus好像也有公式
也是一樣16和32的公式也不同

我想找的到的話應該就不難寫了!
因為只有這兩個欄位是需要特別去計算!

此外如果強制將32MB格式化成FAT32的話會如何呢?
發表人: Acute    時間: 2005-12-30 06:47 AM

我去把我N 年前寫的程式啃了一下
下面是我讀取磁碟系統時, 使用的macro
#define _ISFAT32(dpbp)  (((dpbp)->dpb_fatsize)==0)
#define ISFAT16(dpbp)   (((dpbp)->dpb_size)>FAT_MAGIC   && ((dpbp)->dpb_size)<=FAT_MAGIC16 )
#define ISFAT12(dpbp)   ((((dpbp)->dpb_size)-1)<FAT_MAGIC)

所以, FAT32 是你說的, 把fatsize 設為0 即可
這樣子, FAT32 就沒有cluster number 的限制
FAT16/12 之間才有cluster number限制
因此, 要把任何size format 成FAT32 都是可以的, 呵
^^" 不好意思, 前面記錯了

FAT table size 的算式其實算一樣, 只是參數不同, 所以會以為不一樣
FAT table size 的計算規則是, 必須先知道total sectors (要先扣除其他需要空間的剩餘實際可用值)
然後就導入公式, 理論公式大約是:
cluster number = (total sectors * sector size + fat number * fat size * 2)/(sectors per cluster * sector size + fat size *2)
名詞解釋:
cluster number ===> 理論上可以得到的cluster 總數
total sectors    ===> Partition total sectors - 已經必須使用的sectors
sector size ====> 512, 這個是固定值, 呵
fat number ===> 2, 這個也是固定值, 表示有幾份fat table, 當然, 弄成非2 也行啦, 只是... 很少人這麼幹
fat size  ===> 一個FAT record 的size, FAT16 就是2, FAT32 就是4, FAT12 是1.5
sectors per cluster ===> 一個cluster 含多少個sectors

這個數學式不能直接套用FAT12, 因為沒有1.5個byte 這個東西, 而且, 一個sector 是512, 1.5 個bytes 也不能整除, 所以, 需要經過化簡計算, 才能得到真正的FAT12 的計算公式

跑完上面的數學式之後, 得到的並不是真實值, 而是初步概算值
後面再精算一次, 精算的式子大約是:
fat sectors = ((cluster number+2)*fat size)/sector size, 採無條件進位法
real cluster number = (total sectors - fat number * fat sectors)/sectors per cluster
名詞解釋:
real cluster number ===> 最終的cluster 數目
fat sectors ===> 每個FAT table 需要使用的sectors 數目

呵, 上面的式子是我臨時推算的, 應該不會錯誤啦
理論就是,
(可用總空間+FAT 需要保留兩個的record (這是FAT 最前面的規定空間))/(cluster bytes 數+該cluster 需要的FAT 空間) = 理論cluster 數目

呵, 看得懂嗎? 看不懂, 稍微計算一下囉
因為三個算式都需要補償FAT table 最前面規定的2 個record, 所以, 算式看起來很詭異
你可以嘗試先把補償問題摘除, 算式應該就很容易看懂了
看懂後, 再把補償數值加回去, 重新思考, 就知道為啥我要用那種方法補償
當然, 真實寫程式我從來不會拿這個數學式去計算
因為超過4G 的HDD 就需要動用到64 bits 運算, 對x86 以外的CPU 而言太辛苦
而且, 除了PC base 的compiler, 我也沒見過提供64 bits 運算的
我都會把數學式再重新推演過, 變成最多32 bits 就可以算出來的模式囉
呵, 只要了解上面的數學式, 透過程式技巧與觀念
就可以弄出一個更臭更長的數學式, 但是, 只需要32 bits 運算

Acute.
發表人: saltire    時間: 2005-12-30 11:22 AM

不好意思
上面打了一堆
不過我想還是需要sector per cluster的計算方法吧!?
發表人: Acute    時間: 2005-12-30 02:59 PM


引用:
saltire寫到:
不好意思
上面打了一堆
不過我想還是需要sector per cluster的計算方法吧!?

這個並沒有規則, 用自己爽的rule 去做即可
不信你用同樣容量的HDD 或memory card
然後設法找各種不同的format 程式去format
format 完成你就會發現, 各家format 程式format 出來的cluster size 不見得一樣
而且, 我記得XP 後來乾脆讓user 自己選cluster size, 他預先把可用的cluster size 都先算好, 讓user 自己選一個用, 呵

嗯.. 之前還漏掉一點, FAT32 的最大FAT 值是2^28, 不是2^32-8
FAT12/FAT16 才是2^xx-8

Acute.
發表人: saltire    時間: 2005-12-30 04:02 PM

說也奇怪
我又測試強制將32MB的FAT16改為FAT32
先用CF讀卡機格式化成FAT16(也只能用16啊)
預設sector per cluster為1
算出fat sector為483
接著跑開發板的測試程式並無法通過(測試程式是法國原廠寫的)
計算出的總容量是0KB
接著我改用sector per cluster為2
算出fat sector為243
再測試後就出現31XXXKB了
真是奇怪
1不行
2就行
怪了呢
不過接下來再測試寫入時仍然會出錯
明明就有31MB可以用
寫到16MB時就說寫滿了
真是怪奇
發表人: saltire    時間: 2006-1-2 05:21 PM

終於收到創見送回來的CF卡了
已經修改成Fix mode了
不過依舊無法通過feature command set的測試
(Power Saving Mode is Active Idle & Enable write cache)
雖然創見宣稱有遵循CFA的SPEC製作
但是TRY的結果就是不行
此外又為何SanDisk的32MB又可以通過feature command set呢
真是傷腦筋_Orz
發表人: Acute    時間: 2006-1-3 11:02 PM

即使是HDD, feature command set 提供的也不一樣阿
feature command set 一般用來設定Identify 的內容
各家HDD 允許改變的內容並不相同, 所以, 可以使用的command 內容也不盡相同

Acute.
發表人: saltire    時間: 2006-1-3 11:34 PM

那說也奇怪
如果不執行Feature Command Set的話
(Power Saving Mode is Active Idle 和 Enable write cache)
即使IDE初始化後仍然無法正常讀寫(開發板的程式會當掉)

想問說
Power Saving Mode is Active Idle 和 Enable write cache
為何要做這兩個FEATURE COMMAND呢?
發表人: Acute    時間: 2006-1-4 12:46 AM


引用:
saltire寫到:
那說也奇怪
如果不執行Feature Command Set的話
(Power Saving Mode is Active Idle 和 Enable write cache)
即使IDE初始化後仍然無法正常讀寫(開發板的程式會當掉)

想問說
Power Saving Mode is Active Idle 和 Enable write cache
為何要做這兩個FEATURE COMMAND呢?

應該是你init 程序有問題
而不是需要做那兩個動作, 呵
正常而言, 根本不需要那兩個動作

Acute.
發表人: saltire    時間: 2006-1-5 04:32 PM

MBR和BOOT SECTOR完成後!
接下來FORMAT要做哪些步驟呢?
發表人: Acute    時間: 2006-1-5 08:49 PM

@_@ 這一頁(第三頁) 的第一篇... 寫的那麼長... 不就是說FORMAT 過程需要做的事情嗎?
Acute.
發表人: saltire    時間: 2006-1-6 10:28 AM

忘了上面的文章有提到一些
不過FAT32的FAT size不是固定為4嗎?
為何還要計算?

接下來是要做FSinfo和Back boot sector
那Cluster reserved sector是要如何求得呢?
發表人: Acute    時間: 2006-1-6 07:08 PM


引用:
saltire寫到:
忘了上面的文章有提到一些
不過FAT32的FAT size不是固定為4嗎?
為何還要計算?

接下來是要做FSinfo和Back boot sector
那Cluster reserved sector是要如何求得呢?

你都沒仔細看文章內容
4 bytes 是單一記錄的大小, 整個FAT table 的size, 當然是4 *cluster number, 他不可能固定, 呵
reserved sector 是整個Partition 的保留, 不是cluster 的保留
一般可根據HDD size/cluster size 的餘數, 但是如果餘數過小, 就只好犧牲一個cluster
偷懶的作法, 就是固定配置一個size, 例如10個sectors, 呵, 剩下的, 才去計算可以變出多少cluster
餘數再加回reserved or hidden sectors
反正, 這些東西, 都只是規格需求, 並沒有強制規定, 爽就可以了
就算你浪費了一些空間, 也沒有人可以發現的, 呵
真的發現了, 也不會怎樣, 都說過了, Partition Magic 都會算錯, 還不是照樣賣的很爽
大家還不是一樣用的很過癮, Who care ?
再說, XP 的Disk Manager 如果切割logical partition 會硬生生偷吃掉HDD 約8M 左右空間, 基本上, 也沒人因此去罵MS 吧? 呵

Acute.
發表人: saltire    時間: 2006-1-11 09:24 AM

我發現MS的FORMAT的FSINFO怪怪的
LBA = 33; numSectors: 1
readLBA(): Read OK. Buffer contents:
0000:  52 52 61 41 00 00 00 00 00 00 00 00 00 00 00 00  RRaA............
0010:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

01D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
01E0:  00 00 00 00 72 72 41 61 05 E8 01 00 03 00 00 00  ....rrAa........
01F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA  ..............U.

總共可用的cluster數目
好像把保留磁區(32)也一起算進去了
到底再計算時該不該把保留磁區一起算在內呢?
發表人: Acute    時間: 2006-1-12 07:32 AM


引用:
saltire寫到:
我發現MS的FORMAT的FSINFO怪怪的
LBA = 33; numSectors: 1
readLBA(): Read OK. Buffer contents:
0000:  52 52 61 41 00 00 00 00 00 00 00 00 00 00 00 00  RRaA............
0010:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

01D0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
01E0:  00 00 00 00 72 72 41 61 05 E8 01 00 03 00 00 00  ....rrAa........
01F0:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA  ..............U.

總共可用的cluster數目
好像把保留磁區(32)也一起算進去了
到底再計算時該不該把保留磁區一起算在內呢?

設法安裝98 or ME, 然後你給他改一改, 用98/me 的磁碟檢查, 就知道哪個值對
我記得XP 不會去檢查FSINFO, 98/ME 會

Acute.




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0