我目前正在開發一個簡單的作業系統(GitHub:https : //github.com/Nutty000/PlanetOS)
我想讓作業系統在真正的硬體上作業,但由于檔案系統的原因,我在做這件事時遇到了麻煩......我希望我的作業系統基于 FAT32 檔案系統,但我需要以某種方式不覆寫 BPB在 MBR 上。我想撰寫一個程式來復制現有的 BPB 并將其放在我的 .bin 可啟動檔案的開頭,但是:
我不知道如何制作那個程式,磁盤相關的東西對我來說太難而且很混亂
BPB 太大,如果我復制它,那么我的引導加載程式代碼將無法容納 512 位元組
我不知道我應該復制現有 MBR 代碼的哪些部分
我試圖解決這個問題幾個小時所以如果我犯了任何語法錯誤,請原諒。
uj5u.com熱心網友回復:
MBR 中沒有 BPB。您正在混合兩種型別的引導扇區。
在MBR(主引導記錄)是磁盤上的第一個扇區。它在其磁區表中包含從偏移量 01BEh 開始的磁區資訊。在這種引導扇區中,前 446 個位元組 (512-64-2) 可用于引導扇區程式,其任務是加載 DBR。
該DBR(DOS引導記錄)上所設定的可引導從磁區表磁區的第一個扇區。這種引導扇區確實包含 BPB(BIOS 引數塊)。對于 FAT32,它占據前 90 個位元組。考慮到最后的強制引導扇區簽名,您有 420 個位元組 (512-90-2) 可用。
我不知道如何制作那個程式,磁盤相關的東西對我來說太難而且很混亂
對于想要創建自己的作業系統的人來說,這太糟糕了。
BPB 太大,如果我復制它,那么我的引導加載程式代碼將無法容納 512 位元組
您必須針對代碼大小優化代碼。所需的結構就是它們。
我不知道我應該復制現有 MBR 代碼的哪些部分
首先將現有的 DBR 從磁盤復制到一個檔案,例如。'MyDBR.bin'。然后像這樣寫你的引導扇區(FASM):
jmp begin
nop
FILE 'MyDBR.bin':3,87
Begin:
...
times 510-($-$$) db 0
dw 0AA55h
uj5u.com熱心網友回復:
對于 MBR
MBR“應該”(參見注釋)具有 BPB 的唯一情況是未磁區的磁盤,其中磁盤的第一個扇區也是檔案系統的第一個扇區。這主要是舊軟盤而不是其他任何東西(其他所有東西要么使用磁區,要么使用具有不同規則的 ISO9660 之類的檔案系統)。
注意:“應該”意味著如果沒有 BPB,某些作業系統(例如 Windows)會抱怨磁盤未格式化。韌體或硬體對 BPB 的存在沒有嚴格要求;并且您的作業系統可以根據自己的需要制定自己的規則。
對于舊軟盤,通常作業系統開發人員會做相反的事情 - 例如,他們將擁有(或撰寫)一個實用程式來創建正確/所需大小的軟盤映像(例如,標準 3.5 英寸軟盤為 1440 KiB)為該軟盤格式創建一個合適的 BPB;然后將映像復制到他們想要的任何軟盤中,而無需關心軟盤之前的內容(可能在格式化軟盤之后立即或作為格式化軟盤的一部分)。更常見的是(現在軟盤本身已經過時,實際上它們實際上不存在)軟盤映像直接用于仿真器,或合并到 CD 映像/ISO 中并用于軟盤仿真,其中沒有物理軟盤涉及磁盤(并且沒有“以前的內容”)。
如果您確實需要在保留現有 BPB 的同時寫入磁盤的新第一個扇區;然后您可以撰寫一個實用程式來執行此操作(例如,將舊的第一個扇區讀入緩沖區,然后覆寫緩沖區中 BPB 之前的前幾個位元組和 BPB 之后的其余位元組,然后將修改后的緩沖區寫回磁盤);或者您可以使用現有工具(特別是dd大多數 *nix 系統上的實用程式)。
另請注意,FAT32 對軟盤沒有意義(因為您需要 FAT12 的體積很小)。
對于 FAT32 磁區的第一個扇區(不是 MBR)
對于磁區磁盤,如果您使用 FAT32,則磁區的第一個扇區可能包含引導加載程式的第一個扇區(對于 BIOS,而不是 UEFI)以及 BPB(FAT32 檔案系統需要)。在這種情況下,它主要是應用于不同扇區的相同解決方案(例如,使用適合磁區/磁盤的良好 BPB 覆寫,或使用工具保留舊的 BPB 并僅修改第一個扇區的“非 BPB”部分)。
請注意,最終您將最終撰寫某種作業系統安裝程式,允許用戶創建磁區、格式化磁區并在新磁區上安裝作業系統(包括引導加載程式和許多其他檔案) . 通常,您撰寫的作業系統安裝程式將在您撰寫的作業系統之上運行(并從 CD 或 USB 啟動);除了使用內核、驅動程式等之外,還將回收您為作業系統撰寫的一堆實用程式(例如磁區管理工具等)。
- 我不知道我應該復制現有 MBR 的哪些部分或磁區代碼的第一個扇區
BPB 的位置和大小取決于它是哪個版本。幸運的是,它們都在維基百科(在https://en.wikipedia.org/wiki/BIOS_parameter_block)上進行了描述。
大多數情況下,為了涵蓋“最壞/最大的情況”,您要確保您的引導加載程式不使用偏移量 0x000B 到 0x0059(并且無論您使用什么工具將引導加載程式的第一個扇區與預先存在的 BPB 合并,從偏移量 0x000B 到 0x0059 的位元組)。
當然,對于 512 位元組的扇區大小,為 BPB 丟失大約 80 位元組會使引導加載程式的第一扇區更難包含找到正確磁區所需的代碼,然后加載自身的其余部分或第二階段(尤其是如果有足夠的健全性/錯誤檢查和足夠的錯誤訊息)。有時人們通過在安裝引導加載程式時設定一些變數(例如“磁區中第二個扇區的 LBA”)來緩解問題(如果您撰寫自己的引導加載程式安裝程式,這相對容易)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/337095.html
上一篇:根據今天的日期突出顯示列
