從零開始寫一個操作系統內核 筆記(三) 番外篇 FAT12 魔改 FAT32 文件系統 硬盤文件讀取方式

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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章