|
|
Acute
論壇第一大毒王
論壇第一小神童
. 積分: 3281
. 精華: 8
. 文章: 11574
. 收花: 14037 支
. 送花: 3260 支
. 比例: 0.23
. 在線: 323 小時
. 瀏覽: 2250 頁
. 註冊: 8219 天
. 失蹤: 5571 天
|
|
|
|
|
|
|
#31 : 2005-12-29 09:02 PM
只看本作者
|
送花
(6)
送出中...
|
|
|
~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.
[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
|
|