簡體   English   中英

x86 32位計算機上的操作系統引導過程的一些詳細信息

[英]Some Details of The Boot Process of OSes on x86 32-bit machines

我正在嘗試編寫一個供自己使用的操作系統,我想顯示一個具有VGA輸出的空白(黑屏),但是我有一些問題(問題):

  1. 在FAT32下,我使用MBR引導加載程序從Bochs讀取bximage生成的虛擬磁盤映像的第一個扇區。 我應該將顯示黑屏的第二個已編譯代碼放在哪里(哪個扇區)? 如何使用dd實用程序呢? 我的第二個編譯的代碼文件只有9個字節。

  2. 是否需要VBR?

  3. 我如何知道數據區域(FAT32)的開始和結束位置?

我重寫了此鏈接提供的引導程序。

我的磁盤文件規格是:20M,CHS 40/16/63

按年代順序...

最初沒有硬盤,並且(如果您未使用“ ROM中的BASIC”)計算機是從軟盤啟動的。 在這種情況下,卷的第一個扇區(軟盤)包含操作系統的引導加載程序。

在添加硬盤並使用類似方案后不久(卷/硬盤的第一個扇區包含操作系統的引導加載程序)。

但是,人們很快意識到,對於單個卷使用整個“大”硬盤是愚蠢的/不靈活的。 因此發明了一種分區方案,將硬盤分為多個卷。 在這種情況下,磁盤的第一個扇區(MBR)包含一個分區表,其中一個被標記為“活動”分區,以及一些用於“鏈式加載”活動分區的第一個扇區(引導加載程序)的代碼。 這成為“極端標准”,然后人們對其進行了擴展以支持多種不同的操作系統,並且大多數啟動管理器都使用此方法支持多種操作系統。

注1:我將“啟動管理器”定義為用來選擇要啟動哪個操作系統的東西,而將“啟動加載器”定義為用來啟動所選擇的特定OS的東西。 理想情況下,它們彼此無關,引導管理器應該與任何操作系統都不相關,並且最終用戶應該能夠以自己喜歡的方式更改引導管理器,而不會破壞或影響任何操作系統或引導加載程序。 可悲的是,(對於Windows)Microsoft敵對允許使用簡單,合理且受良好支持的方法引導多個不同的操作系統(包括允許同時安裝同一版本的Windows的多個實例,這可能很有用-例如,一個用於工作的操作系統,一個用於孩子的單獨操作系統,都安裝在同一台計算機上),並試圖用自己的“ boot.ini”愚蠢行為來掩蓋理智,這只會使所有事情變得毫無益處(除了給予Microsoft更多控制權之外)有關您使用計算機的操作)。 當然,當用戶僅在計算機上安裝一個OS時,OS安裝程序可以很好地進行安裝(可選,當且僅當用戶需要時),例如,因為他們還沒有自己的啟動管理器,它可以提供並安裝最少的操作系統MBR只是鏈式加載操作系統的引導加載程序。

隨着時間的流逝,添加了更多設備。 首先是網卡和從網絡啟動的能力。 這與“從磁盤啟動”沒有什么不同。 取而代之的是,網卡的ROM(在與DHCP服務器協商后)從服務器下載了整個“啟動文件”(不限於1個扇區,如果需要,可以為500 KiB),然后提供了一個API(引導加載程序可用來訪問網絡(例如,發送/接收數據包,使用TFTP協議下載更多文件等)的“ PXE API”。

添加的另一種設備是CD-ROM。 為此,創建了一個新的規范(“ El Torito可啟動CD-ROM規范”),部分目的是使您可以擁有一個包含多個條目的引導目錄,這些條目用於多種體系結構(例如,一個用於“ 80x86 PC”,一個用於“ PowerPC”,等),然后讓固件為正在引導的計算機選擇最合適的引導加載程序。 對於PC,有3種方法-仿真軟盤,仿真硬盤或“不仿真”。 仿真選項的工作方式與原始的“從磁盤啟動”方法相同(並使用512字節扇區等),但功能有限且運行緩慢,除了與舊版操作系統的兼容性之外,不應將其用於任何其他用途。 對於“無仿真”,它與原始的“從磁盤啟動”方法完全不同,固件應該加載整個“啟動文件”(不限於1個扇區,如果您願意,可以為500 KiB),並且扇區將是2048個字節(而不是512個字節)。

甚至以后 UEFI發明了。 對於80x86 PC,這有兩種版本-32位80x86和64位80x86。 從理論上講,您可以有一個64位UEFI引導加載程序,該加載程序可以切換到受保護模式/ 32位並啟動32位OS。 您可以擁有一個32位UEFI引導加載程序,該加載程序可以切換到長模式/ 64位並啟動64位OS。 但是,32位UEFI非常罕見(一些舊的Apple Mac,幾乎沒有其他),這些計算機可能還支持“ BIOS兼容啟動”。 因此,不值得支持32位UEFI。 一般而言,對於UEFI,它會加載並執行整個文件(無論使用哪種引導設備),並提供啟動加載程序可以使用的API(例如,設置視頻模式,獲取內存映射,加載其他文件等)。 )。

注意2:UEFI會嘗試這樣做,以便無論您從哪種類型的設備進行引導,引導都可以相同地工作。 實際上,這不能很好地工作,您可能需要CD的其他引導加載程序(可以訪問CD本身上的文件,並且不僅限於中間的FAT文件系統映像),還需要其他引導加載程序用於CD。網絡(即使只是為了允許您將IP地址傳遞給操作系統,並避免在操作系統啟動后重復執行緩慢的DHCP操作)。

借助UEFI,還引入了新的分區方案(GPT或“ GUID分區表”)。 這具有多個優點,並且(對於將新操作系統作為計算機上唯一的OS安裝的情況)應該被視為默認值(而舊的“ MBR分區”應該僅被視為與舊操作系統的兼容性而被淘汰)。

大多; 對於80x86,您可能需要4個或更多不同的引導加載程序:

  • 一個用於BIOS和未分區的磁盤設備(軟盤)
  • 一個用於用“ MBR分區”分區的BIOS和磁盤設備
  • 一個用於用“ GPT分區”分區的BIOS和磁盤設備
  • 一種用於BIOS和網絡引導/ PXE
  • 一種用於BIOS和“無仿真” CD引導
  • 一個用於64位UEFI磁盤
  • 一個用於64位UEFI CD-ROM
  • 一個用於64位UEFI網絡

當然,所有這些情況都“足夠不同”,試圖擁有一個涵蓋多種不同情況的通用引導加載程序是很愚蠢的(而且在類似的情況下,例如“僅512字節”的限制會限制您如果您嘗試將注定失敗)。

我還“強烈建議”在引導加載程序和操作系統的其余部分之間進行某種抽象(例如,為操作系統定義的“引導協議”,用於描述引導加載程序如何設置,將信息傳遞給操作系統並進行傳輸控制到OS); 這樣,整個操作系統中的任何代碼都無需知道或關心固件是什么(如果是BIOS或UEFI或其他東西,例如kexec() )。 這意味着任何人都可以創建更多的引導加載程序(以支持其他情況和其他設備); 並且(只要所有內容都符合您的抽象規范),整個操作系統都可以使用新的引導加載程序,而無需進行任何更改。

在FAT32下,我使用MBR引導加載程序從Bochs讀取bximage生成的虛擬磁盤映像的第一個扇區。 我應該將顯示黑屏的第二個已編譯代碼放在哪里(哪個扇區)? 如何使用dd實用程序呢? 我的第二個編譯的代碼文件只有9個字節。

這主要是錯誤的。 對於“ BIOS硬盤”,您應該有一個MBR(與操作系統完全無關)和分區,並且操作系統的引導加載程序應從分區的第一個扇區開始(並且應設計為使用DS:SI查找描述其分區的分區表條目,而dl確定分區所在的設備。

是否需要VBR?

在某些情況下(從UEFI,網絡,CD-ROM引導),VBR沒有意義。 在某些情況下(從BIOS硬盤或BIOS USB閃存啟動),“從理論上講是可選的”,但強烈建議這樣做。 因為某些BIOS可能無法識別它(尤其是在USB閃存盒中),而其他操作系統將假定該磁盤未格式化(並且會告訴其用戶該磁盤需要初始化/分區,從而說服用戶操作系統是垃圾,導致用戶意外或有意從磁盤上擦除操作系統)。

我如何知道數據區域(FAT32)的開始和結束位置?

對於FAT; 卷/分區的第一個扇區中的BPB(“ BIOS Parameter Block”(BIOS參數塊),因為它幾乎根本不被BIOS誤用)而存在一些字段,它們告訴您諸如有多少個保留扇區,多少個扇區的信息確實,如果您要使用世界上最差的文件系統之一來處理不適當的事情(例如,對於操作系統的主分區,非常需要有效權限/安全性和容錯之類的東西),那么您您將需要學習有關FAT32的所有知識,以便您可以編寫代碼以允許操作系統在引導后支持它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM