FAT 文件系統 佈局
創建 硬盤
第一步 : bximage -> 選1 -> [hd] 回車 -> [flat]回車 -> 大小自定義 我選的36 -> [c.img]自己命名 -> 完成
第二步 : 格式化 成FAT32 系統 找一個 ubuntu 系統.
敲如下 命令:
sudo mkfs.vfat -F 32 c.img 格式化成 FAT32
vim c.img 打開 c.img
:% !xxd 二進制查看
mount c.img /xxx/ -t vfat -o loop 掛載 fat 文件系統
磁盤的第一個——也就是 0 號扇區被稱爲主引導記錄扇區,也稱爲主引導 記錄 MBR(Master Boot recorder,MBR)。
MBR 由 446 個字節的引導代碼、64 字節的主分區(4 個)表及兩個字節的簽名值“55 AA”組成。
上面創建完成後 可以看到 前 0x59 個 字節 是用來存儲, FAT32 的一些相關信息的。
然後 第 0x5A~ 0x1FF 是 沒有 實際用途的 ,只是存放了 段文字來輸出顯示, 所以 想要實現 引導 就要 修改這裏的 代碼 使它 能 檢索存放在數據區 的 引導程序。
掛載 後 就可以往 裏面 寫數據了。
FAT 表起始項 = 保留扇區數 * 扇區字節數 (512)
FAT表 從 2號 位置開始 前 2個 是系統保留 存儲 特定 信息的。
修改BOCHS 配置文件
bochs 開啓硬盤 讀取
ata0-master: type=disk, path=“c.img”, mode=flat,cylinders=73,heads=16,spt=63
FAT32文件系統,格式和 FAT12 大同小異。
主要變化:
扇區簇大小:512 字節 -> 4K
根目錄項數:
偏移 | 字節數 | 含義 | 值 |
---|---|---|---|
0x00B | 2 | 每扇區字數 | 0x0200 |
0x00D | 1 | 每簇扇區數 | 0x08 |
0x00E | 2 | 保留扇區數 | 0x03F8 |
0x010 | 1 | FAT個數 | 0x02 |
0x011 | 2 | 根目錄項數,FAT32以突破該限制,無效 | 0x0000 |
0x013 | 2 | 扇區總數,小於32M使用 | 0x0000 |
0x015 | 1 | 存儲介質描述負 | 0x0F8 |
0x016 | 2 | 每FAT表佔用扇區數 ,小於32M使用 | 0x0000 |
0x018 | 2 | 邏輯每磁道扇區數 | 0x003F |
0x01A | 2 | 邏輯磁頭數 | 0x00FF |
0x01C | 4 | 系統隱含扇區數 | 0x00000080 |
0x020 | 4 | 扇區總數,大於32M使用 | 0x00784F80 |
0x024 | 4 | 每FAT表扇區數,大於32M使用 | 0x00001E04 |
0x028 | 2 | 標記 | 0x0000 |
0x02A | 2 | 版本 (通常爲零) | 0x0000 |
0x02C | 4 | 根目錄起始簇 | 0x00000002 |
0x030 | 2 | Boot佔用扇區數 | 0x0001 |
0x032 | 2 | 備份引導扇區位置 | 0x0006 |
0x034 | 12 | 保留 的12個字節的 | 0x00 |
0x042 | 1 | 擴展引導標記 | 0x29 |
0x043 | 4 | 序列號 | 0x6A9C4125 |
0x047 | 10 | 卷標 轉成字符即 | “NO NAME” |
0x052 | 8 | 文件系統 轉成字符即 | “FAT32” |
這裏注意 往上有很多資料 和我自己研究的格式有些出入,我用ubuntu 18 格式化出來的FAT32 的 目錄項 佔 用 64 個字節 前 32 個 好像保存的是長文件名目錄。如果文件名 只有 11 個字節的 讀取 後面 32 個字節 開頭 前 11 個字節就好了。
然後 1a 處 是 文件簇 的 索引 如果 FAT表裏面 是0X0fffffff 說明是左後一個文件。
FAT分區信息 需要 按照自己的硬盤字節信息做修改
主要修改: 磁頭信息 ,每個磁道扇區數,總扇區數 ,FAT表扇區大小。
;*************************************************************************
;Name: CaoMaoBoy
;E-mail:[email protected]
;-------------------------------------------------------------------------
;系統啓動引導加載程序
;從Fat32 文件系統 加載 啓動 OS
;*************************************************************************
[BITS 16]
[ORG 0x0000]
jmp short Fat32Boot_Start ;跳轉指令,轉到0000:7C3E 3個字節
nop
OEM_ID db "CBOS0.01";系統版本號 8個字節
BytesPerSector dw 0x0200;每扇區字節數 2個字節
SectorsPerCluster db 0x01;每簇扇區數 默認 8 1個字節 ;----簇的大小
ReservedSectors dw 0x20;保留扇區個數 2個字節
;-------16 bit ⬆️------->
TotalFATs db 0x02;FAT表格數 默認2 1個字節
MaxRootEntries dw 0x00;根目錄最多可容納 目錄數 歷史字段 FAT32不適用 2個字節
NumberOfSectors dw 0x00;扇區總數 小於32M 在這記錄 大於32M 改TotalSectors 2個字節
MediaDescriptor db 0xF8;介質描述 0xF8位硬盤 1個字節
SectorsPerFAT dw 0x00;每個FAT表 的大小扇區數 FAT32 已經不使用了 2個字節
SectorsPerTrack dw 63;每個磁道扇區數 S ---------->不同硬盤改動 2個字節
SectorsPerHead dw 16;磁頭數 H ---------------->修改 2個字節
HiddenSectors dd 0x00;分區目前已使用 隱藏扇區數 4個字節
;-------16 bit ⬆️------->
TotalSectors dd 0x11f70;大於32M這裏修改 扇區數 ---------------> 4個字節
BigSectorsPerFAT dd 0x0236;每個FAT表使用扇區數 -----------> 4個字節
Flags dw 0x00;標記 2個字節
FSVersion dw 0x00;版本號 2個字節
RootDirectoryStart dd 0x02;根目錄簇號 4個字節 起始於數據區的 + 2個簇 4個字節
;-------16 bit ⬆️------->
FSInfoSector dw 0x01;文件系統信息扇區 2個字節
BackupBootSector dw 0x06;備份引導扇區 位於文件系統的6號扇區 2個字節
TIMES 12 db 0x00;預留12字節未使用
;-------16 bit ⬆️------->
DriveNumber db 0x80;驅動器編號 0號設備 1個字節
ReservedByte db 0x00;預留 1個字節
Signature db 0x29;擴展引導標記 1個字節
VolumeID dd 0x00 ;4個字節
VolumeLabel db "QUASI BOOT" ;11個字節
SystemID db "FAT32 ";文件系統 8個字節
;-------30 bit ⬆️------->
引導 加載成功:
MyGitHub:
https://github.com/qiaojinxia/HelloOperationSystem
文件名: fat32boot.asm
如果本文 有幫到您,不要吝嗇你的Start!