Opencore Legacy (傳統)BIOS 安裝黑蘋果之官方指導-理解UEFI和傳統BIOS

首先,UEFI也是一種 BIOS,區別就在于 Legacy BIOS沒有UEFI這么靈活,為什么這么說呢?

?Legacy BIOS你可以看作是一塊機器的操作面板,里面有很多開關,我們平常在里面做的一些設定,不過是在扳動開關而已。也就是說Legacy BIOS的東西是固定的,你無法做出真正的改變,你的設定改變,只不過是主板把你的最終開關打向了哪一邊記錄下來了而已。因為 BIOS芯片的容量是很小的,1M或2M,8M,它無法再做更多的事了,只能允許你改一改記錄。而要想真正改變這個系統,你需要把它拿到別的系統下去做變更,也就是硬刷。硬刷才是真正的改BIOS!就像你把那塊面板拆下來,重新接或換幾個開關之類操作。

剛剛說了,?Legacy BIOS由于容量小,它只能作一些記錄和硬件進行一些簡單的通訊,比方說,在BIOS里可以認得到硬盤,但是它也只能做到這一步了,它不知道硬盤里面有啥文件,就是不能給硬盤文件列表,UEFI可以做到這一點,UEFI認識硬盤,也知道硬盤里面有啥東西。有沒有像順豐跟美團的感覺?順豐快遞員知道你有件,但是不知道你是什么件,而美團則不僅知道你有單,還知道你點的是啥,厲害的小哥,還可以代你做很多事。

UEFI更像一個小型的系統了。原來傳統BIOS除了把主板上的硬件信息讀取交給操作系統后,就等著系統發號施令了,在硬件層和軟件層傳遞、交換信息,忙得一匹,卻毫無頭緒。傳統BIOS和操作系統是一對一的關系,一次只能引導一個操作系統,而UEFI則可以輕松引導多系統。因為UEFI有專門的EFI分區,分區可以達到600MB,可以往里面寫入的東西就多了,所以可玩性比傳統BIOS強太多了,由于UEFI規范可以對硬盤上的文件列表,有了適當的引導器,比方說opencore,那么就可以 在操作系統啟動之前可以任意抓取OS? ?Loader并陳列出來,供你決定進入哪一個OS,妥妥的皇上選妃的感覺啊。?

UEFI一開始是微軟和英特爾聯合其他大公司搞出來的硬件接口規范,想一想啊,為啥微軟要搞這個東西呢?因為他有需要啊!為什么這么說呢?因為大容量硬盤的產生逼得他不得不做這個事啊。大容量硬盤及GPT分區出來后,微軟的操作系統要想在舊的硬件或者新的硬件上啟動,windows就必須作出一個判斷,這臺系統硬盤的分區是使用的MBR還是GPT分區,這就需要加載些文件來作判斷了,原來的BIOS顯然不能完成這項工作。

如果往深處想,可能你會發現,組成系統的單個要素,本質上也是一堆的開關,但為什么CPU+內存+輸入輸出端+操作系統就構成了一個系統呢?首先,CPU里面有邏輯門,控制邏輯門就可以進行加減乘除運算,更高級的運算則是結合了四則運算、關系運算、邏輯運算來達成,也就是說CPU在內存的幫助之下,實現了邏輯層,在邏輯層之上的運算已經與底層的開關不相干了,也就是說底層的物理開關,在不同的時序上的重復,意義是完全不一樣的。

將來的人機接口,或者說機腦接口,其實也是一種固件接口,它的規范,我們應該也要趁早實現,搶先一步,占領高地。

以上是我自己一點粗淺的理解,下面是正式的說明,來看看吧:

引導操作系統

您如何運行第一個程序?

保羅·克爾扎諾諾夫斯基(Paul Krzyzanowski)

2015年1月26日

介紹

有時將一個操作系統稱為“第一個程序”,它使您可以運行其他程序。但是,它通常作為文件(或更常見的是文件集合)存儲在磁盤上。這個“第一個”程序如何運行?

PDP–11 / 70前面板


操作系統是通過引導過程(簡稱為booting)加載的。一個引導裝載程序是其任務是加載一個較大的程序,如操作系統的程序。

當您打開計算機時,其內存通常未初始化。因此,沒有什么可運行的。早期的計算機將具有使操作員能夠按下按鈕以從打孔卡,打孔紙帶或磁帶驅動器中加載字節序列的硬件。計算機前面板上的開關將定義數據源和目標內存地址。在某些情況下,引導加載程序軟件將被硬連接為非易失性存儲器(在早期的計算機中,這將是一排網格,在需要0位的適當位置進行了切割)。

在早期的小型計算機和微型計算機系統中,計算機操作員會使用計算機前面板上的開關來切換代碼以加載更大的程序,對每個內存位置進行編程,然后啟動程序。該程序可能會做一些基本的事情,例如從電傳打字機附帶的紙帶上將連續的字節讀入內存。

在以后的系統中,只讀存儲器將包含一個小的引導加載程序,該引導加載程序將具有基本的智能功能,可以讀取磁盤的第一個扇區(512字節)。

由于此初始程序必須盡可能小,因此功能最少。經常發生的情況是,引導加載程序會加載另一個引導加載程序,稱為第二階段加載程序,該加載程序更為復雜。該第二階段加載器可能會進行錯誤檢查,其中可能還包括其他功能,例如,使用戶可以選擇要引導的操作系統,加載診斷軟件的能力或在操作系統中啟用診斷模式。這種具有引導加載程序加載較大引導加載程序的多階段引導加載程序,稱為鏈加載。

引導加載程序通常會執行系統硬件的某些核心初始化,然后加載操作系統。加載操作系統后,引導加載程序會將控制權轉移給它,不再需要。如果需要,操作系統將自行初始化,配置系統硬件(例如,設置內存管理,設置計時器,設置中斷)并加載設備驅動程序。

基于英特爾(IA–32)的啟動

為了具體說明引導過程的示例,讓我們看一下32位兼容Intel的PC(稍后將介紹64位系統)。該體系結構稱為IA–32(32位英特爾體系結構),定義了自1986年推出的英特爾80386以來大多數英特爾微處理器的指令集。它仍受英特爾最新處理器的支持。

基于IA–32的PC有望在非易失性存儲器(過去為ROM,如今為NOR閃存)中具有BIOS(基本輸入/輸出系統,包括引導加載程序固件)。BIOS是在早期CP / M系統上發現的BIOS的后代,它包含用于訪問某些基本系統設備的低級功能,例如執行磁盤I / O,從鍵盤讀取和訪問視頻顯示。它還包含用于加載第1階段引導加載程序的代碼。

當啟動時重置CPU時,計算機將在內存位置開始執行0xffff0(IA–32體系結構使用segment:offset尋址形式;代碼段設置為?0xf000,指令指針設置為fff0)。

處理器以實模式啟動,這使它只能訪問20位內存地址空間,并提供對I / O,中斷和內存的直接訪問權限(當處理器使用32位尋址和虛擬內存時,它將起作用切換到保護模式)。該位置0xffff0實際上位于BIOS ROM的末尾,并包含對包含啟動代碼的BIOS區域的跳轉指令。

啟動后,BIOS將按照以下順序進行操作:

1、開機自檢(POST)

2、檢測視頻卡(芯片)的BIOS并執行其代碼以初始化視頻硬件

3、檢測其他任何設備的BIOS并調用其初始化功能

4、顯示BIOS啟動屏幕

5、執行簡短的內存測試(確定系統中有多少內存)設

6、置內存和驅動器參數

7、配置即插即用設備(傳統上是PCI總線設備)

8、分配資源(DMA通道和IRQ)

9、識別啟動設備

當BIOS識別引導設備(通常是標記為可引導磁盤的幾個磁盤之一)時,它將從該設備讀取塊0到內存位置0x7c00并跳轉到該位置。

階段1:主啟動記錄

第一個磁盤塊(塊0)稱為主引導記錄(MBR),其中包含第一階段引導加載程序。由于標準塊大小為512字節,因此整個引導加載程序必須適合該空間。MBR的內容是:

第一階段引導加載程序(≤440字節)

磁盤簽名(4個字節)

磁盤分區表,用于標識磁盤的不同區域(每個分區16個字節×4個分區)

階段2:卷啟動記錄

BIOS將控制權轉移到已加載到內存中的MBR的開頭后,MBR代碼將掃描其分區表并加載該分區的卷啟動記錄(VBR)。VBR是從指定分區的第一個磁盤塊開始的一系列連續塊。VBR的第一個塊標識分區的類型和大小,并包含一個初始程序加載器(IPL),該代碼是將加載組成第二階段引導加載程序的其他塊的代碼。在Windows NT派生的系統(例如Windows Server 2012,Windows 8)上,IPL加載一個名為NTLDR的程序,然后該程序加載操作系統。

低級引導加載程序很難加載完整的OS(尤其是可能由多個文件組成的OS)的原因之一是,這樣做需要解析文件系統結構的能力。這意味著要了解目錄和文件名的布局方式,以及如何查找與特定文件相對應的數據塊。沒有太多代碼,僅讀取連續的塊會容易得多。更高級別的加載程序(例如Microsoft的NTLDR)可以讀取NTFS,FAT和ISO 9660(CD)文件格式。

超越Windows

在Intel PC上引導其他操作系統有多種變體。在Linux系統上,一種流行的引導加載程序是?GRUB或GRand Unified Bootloader。GRUB還是一個多級引導加載程序。BIOS當然會做它通常會做的事情:識別可引導設備,加載主引導記錄,并將控制權轉移到此新加載的代碼。在GRUB下,MBR通常包含稱為GRUB Stage 1的第一階段引導加載程序。此第1階段引導加載程序將加載GRUB第2階段。第2階段加載程序為用戶提供了要引導的操作系統的選擇,并允許用戶為這些系統指定任何其他引導參數(例如,強制使用最大內存,啟用調試)。然后,它讀入所選的操作系統內核并將控制權轉移給它。

使用GRUB引導Windows的一個特定問題是Windows不?兼容Multiboot。Multiboot是關于使用單個引導加載程序加載多個操作系統的Free Software Foundation規范。在這種情況下,GRUB所做的只是傳統的Windows啟動過程。它引導通常位于MBR中的引導加載程序(或運行Windows引導菜單程序)。從那時起,GRUB不再可用,Windows不知道發生了什么,本機Windows啟動過程將接管工作。

再見,BIOS。您好UEFI

隨著64位架構取代32位架構的出現,BIOS開始顯得過時了。英特爾著手創建BIOS后續產品的規范,該規范沒有限制,即必須以20位尋址在16位模式下運行啟動代碼。該規范稱為統一可擴展固件接口或UEFI。盡管它是由英特爾開發的,但自2005年以來由Unified EFI論壇進行管理。許多更新的64位系統(包括Mac)都使用它,它們也具有用于運行Windows的舊版BIOS支持。

EFI支持的一些功能包括:

BIOS組件

從BIOS保留了一些組件,包括電源管理(高級配置和電源接口,ACPI)和系統管理組件(例如,讀取和設置日期)。

支持更大的磁盤

BIOS每個磁盤僅支持四個分區,每個分區最多可容納2.2 TB。UEFI支持的最大分區大小為9.4 ZB(9.4×10?21字節)。

無需以16位(實際)模式啟動

引導前執行環境使您可以直接訪問所有系統內存。

設備驅動程序

UEFI包括設備驅動程序,包括解釋與體系結構無關的EFI字節碼(EBC)的能力。但是,操作系統使用它們自己的驅動程序,因此,與BIOS一樣,這些驅動程序通常僅用于引導過程。

引導管理器

這是很重要的。舊的BIOS僅具有加載單個塊的功能,因此需要多階段引導過程。UEFI具有自己的命令解釋器和完整的啟動管理器。您不再需要專用的引導加載程序。只要將可引導文件放入UEFI引導分區,該分區的格式設置為FAT文件系統(舊Windows系統中的標準文件系統格式;幾乎每個操作系統都知道如何處理)。

可擴展性

固件是可擴展的。UEFI的擴展可以加載到非易失性存儲器中。

使用UEFI引導

使用UEFI,不再需要主引導記錄來存儲第1階段引導加載程序。UEFI具有聰明的能力來解析文件系統并自行加載文件,即使該文件不占用連續的磁盤塊也是如此。相反,UEFI讀取GUID(全局唯一標識符)分區表(GPT),該表位于塊0之后的塊中(由于遺留原因,MBR仍位于該塊中)。GPT描述了磁盤上分區表的布局。由此,EFI引導加載程序將識別EFI系統分區。該系統分區包含用于設備上其他分區上安裝的所有操作系統的引導加載程序。對于支持EFI的Windows系統,UEFI加載?Windows引導管理器(bootmgfw.efi)。對于較舊的64位NT系統,EFI將加載IA64ldr。對于Linux,有很多選擇。兩種最常見的是使用GRUB(大Unified Bootloader的)的EFI感知版本并加載一個文件,如grub.efi或有EFI負荷負載ELILO.EFI的EFI裝載機。

通常,即使使用UEFI,占主導地位的方法是加載專用于特定操作系統的引導加載程序,而不是直接加載該操作系統。但是,不再需要需要加載多個引導加載程序的多階段引導過程。

非英特爾系統

到目前為止,我們的整個討論都集中在啟動基于Intel PC的體系結構(包括IA–32 / IA–64兼容體系結構,例如AMD的體系結構)上。這是當今PC(通過服務器的筆記本)中的主要體系結構,但是那里有很多非英特爾設備,特別是在嵌入式設備(例如手機)中。那他們呢?

引導過程有許多實現。許多嵌入式設備不會加載操作系統,但是已經將其存儲在非易失性存儲器(例如閃存或ROM)中。例如,那些加載OS的操作系統(例如基于ARM的Android手機)將在設備開機時在只讀存儲器(通常在NOR閃存)中執行代碼。此引導代碼嵌入在某些設備的CPU ASIC中,因此您無需在板上安裝單獨的閃存芯片。

當系統復位(包括加電)時,處理器處于超級用戶(SVC)模式,并且中斷被禁用。在基于ARM的系統上,處理器從address開始執行?0x00000000。包含啟動代碼的閃存映射到地址0x00000000重置時。該代碼執行各種初始化,包括在DRAM中設置異常向量表以及將應用程序代碼從ROM復制到DRAM(代碼在DRAM中運行得更快)。該代碼將DRAM重新映射到地址0,從而隱藏了閃存(處理器具有REMAP位以更改閃存的映射)。然后初始化存儲系統。這涉及設置內存保護和設置系統堆棧。然后初始化I / O設備,并將處理器更改為用戶模式。引導固件會檢測可引導媒體并加載并運行第二階段引導加載程序(如有必要)。第二階段引導加載程序對于大型系統通常是GRUB,對于嵌入式系統通常是uBoot。該第二階段加載器加載操作系統并將控制權轉移給該操作系統。

Mac OS X

至少在OS 8和OS X上,基于PowerPC的Apple Macintosh系統的較舊版本均基于開放固件。開放式固件起源于Sun,并在非Intel Sun計算機中使用。蘋果公司切換到英特爾系統后,便采用了UEFI作為其啟動級固件。

較舊的Mac

開放式固件存儲在ROM中,并且像PC BIOS一樣在開機時執行。由于開放固件被設計為與平臺無關,因此它以Forth(一種基于堆棧的簡單語言)實現,并被編譯為字節碼而不是本機指令。固件包含字節碼解釋器。

與BIOS不同,開放式固件(Open Firmware)為用戶提供了一個命令行處理器,從中可以編輯系統配置參數,例如減少物理內存量,調試系統甚至啟動telnet服務器,以便您可以與通過以太網連接從遠程計算機執行固件和啟動過程。

在引導操作系統之前,開放式固件通過探測主板和擴展設備上的組件來生成設備樹。

與PC BIOS一樣,Open Firmware包含設備驅動程序,固件中的引導過程可用于訪問磁盤,鍵盤,顯示器和網絡。但是,這些驅動程序全部在Forth字節碼系統FCode中實現。與BIOS一樣,這些驅動程序僅在引導過程中使用。操作系統本身具有自己的本機運行時驅動程序。

與BIOS不同,Open Firmware可以解析HFS / HFS +文件系統(Mac上的本機文件系統),因此您可以使用Open Firmware命令解釋器從硬盤加載啟動文件并運行它。默認情況下,Open Firmware從系統分區加載文件。在OS 9系統上,這是“系統”文件夾中名為“ Mac OS ROM”的文件。在OS X系統上,它會加載?/System/Library/CoreServices/BootX。BootX是引導加載程序,然后將其加載到內核中。

現代的Mac

Mac將UEFI用作其系統固件。

Mac啟動時,執行的第一個代碼是BootROM。這將為相關的硬件設備設置EFI驅動程序,初始化一些硬件接口,驗證是否有足夠的內存可用,并執行簡短的開機自檢。與PC BIOS(對文件系統一無所知,只能讀取原始磁盤塊)不同,Mac上的UEFI已擴展為可以解析磁盤上的FAT(傳統DOS / Windows)和HFS +(本地Mac)文件系統。它讀取GPT(GUID分區表)以標識磁盤分區。默認啟動卷存儲在NVRAM中。

HFS +卷標頭(位于HFS +文件系統開頭的數據)沒有指定引導加載程序的路徑,而是指向受祝福的文件或受祝福的目錄(請參閱?bless命令。如果目錄是受祝福的,則表明EFI固件可以在該目錄中查找引導加載程序。如果文件受保護,則告訴EFI固件將該文件作為引導加載程序進行加載(存在其他變化,例如從未安裝的卷進行引導)。

默認情況下,引導加載程序位于?/System/Library/CoreServices/boot.efi磁盤的根(通常是)分區上。

或者,固件支持從網絡服務器(netboot服務器)下載第二階段的引導程序或內核。

當boot.efi文件被加載,計算機顯示器屏幕上的一個金屬的蘋果標志。引導加載程序以及基本的驅動程序擴展會加載到內核中,然后再運行?launchd來執行各種啟動腳本和程序。裝入內核后,旋轉的齒輪會出現在Apple徽標下方。當內核運行第一個進程launchd時,屏幕變為藍色。

有關OS X如何啟動的說明,請參見“?什么是Mac OS X”。

為了支持引導基于BIOS的操作系統,例如使用GRUB或其他支持BIOS的引導加載程序的較舊Windows系統和Linux系統,EFI從系統固件中安裝了“兼容性支持模塊”(CSM)組件。然后,這將啟動基于BIOS的引導過程。僅當用戶選擇Windows作為要啟動的默認操作系統時,才會加載此兼容性支持模塊。現在,引導過程是基于標準BIOS的引導。加載并執行主啟動記錄(MBR),然后查找并加載Windows(或Linux)分區的卷啟動記錄。

看完以上,覺得自己那點粗淺理解在某些點上還是嵌合地很到位的,相較于這種教堂式的解說,應該是更好理解的吧。

原文地址:https://www.cs.rutgers.edu/~pxk/416/notes/02-boot.html

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。