BIOS與UEFI以及模擬環境
主機板
:矩形電路板,上面安裝了主要電路系統,bios晶片,i/o控制晶片,擴充套件插槽,鍵和麵板控制開關介面
**晶片組(Chipset)**是主機板的核心組成部分,幾乎決定了這塊主機板的功能,進而影響到整個 電腦系統效能的發揮。按照在主機板上的排列位置的不同,通常分為 北橋晶片和 南橋晶片。北橋晶片提供對 CPU的型別和主頻、記憶體的型別和最大容量、 ISA/ PCI/ AGP插槽、 ECC糾錯等支援。南橋晶片則提供對 KBC(鍵盤控制器)、 RTC(實時時鐘控制器)、USB( 通用序列匯流排)、Ultra DMA/33(66)EIDE資料傳輸方式和 ACPI(高階能源管理)等的支援。其中北橋晶片起著主導性的作用,也稱為主橋(Host Bridge)。
主機板的平面
在電路板下面,是4層有致的電路佈線;在上面,則為分工明確的各個部件:插槽、晶片、電阻、電容等。當 主機加電時,電流會在瞬間通過 CPU、 南北橋晶片、 記憶體插槽、 AGP插槽、 PCI插槽、IDE介面以及主機板邊緣的 串列埠、並口、 PS/2介面等。隨後,主機板會根據 BIOS( 基本輸入輸出系統)來識別硬體,並進入作業系統發揮出支撐系統平臺工作的功能。
北橋晶片
南橋晶片的發展方向主要是整合更多的功能,例如網絡卡、RAID、IEEE 1394、甚至WI-FI無線網路等等。
由於已經發布的AMD K8核心的CPU將記憶體控制器整合在了CPU內部,於是支援K8晶片組的北橋晶片變得簡化多了,甚至還能採用單晶片晶片組結構。這也許將是一種大趨勢,北橋晶片的功能會逐漸單一化,為了簡化主機板結構、提高主機板的整合度,也許以後主流的晶片組很有可能變成南北橋合一的單晶片形式
BIOS
BIOS,是Basic Input Output System的詞頭縮寫。”如果直譯為中文,那就叫做“基本輸入輸出系統”
韌體也是一個程式,是儲存在BIOS硬體晶片上的程式,bios晶片相當於一個ROM晶片。
基本功能:
1、POST自檢和硬體自檢程式:通過讀取CMOS儲存中的硬體資訊,識別硬體配置,並對硬體自檢和初始化。
2、作業系統啟動程式:硬體自檢成功後(這時硬碟已經被識別),執行跳轉到作業系統引導裝置的引導分割槽(載入程式儲存在ROM中),將載入程式讀入記憶體,若成功讀入,則進入啟相應裝置上的作業系統啟動過程
3、CMOS設定程式:在電腦開機自檢中,按下進入CMOS設定的快捷鍵,則進入CMOS設定。設定結束後,若進行儲存操作,則更新後的硬體資訊會存入CMOS中並重新進行自檢,否則繼續完成本次自檢後續的過程
4、硬體I/O和中斷服務:軟體在一些對硬體底層的操作中,需要中斷服務或硬體I/O操作,這時就需要BIOS充當軟體和硬體之間“臨時搭橋”的作用。
CMOS,本義上是Complementary Metal Oxide Semiconductor的詞頭縮寫。”直譯為“互補金氧半導體”,是一種半導體技術,屬於數位電路的範疇。但是為了避免再亂造新詞造成混亂,人們乾脆將採用該技術的製程和生產出的元件或晶片也叫CMOS。
計算機領域的CMOS
在計算機領域,CMOS常指儲存計算機基本啟動資訊(如日期、時間、啟動設定等)的晶片。有時人們會把CMOS和BIOS混稱,其實CMOS是主機板上的一塊可讀寫的並行或序列FLASH晶片,是用來儲存BIOS的硬體配置和使用者對某些引數的設定。
一是用於計算機資訊儲存,CMOS作為可擦寫晶片使用,在這個領域,使用者通常不會關心CMOS的硬體問題,而只關心寫在CMOS上的資訊,也就是BIOS的設定問題,其中提到最多的就是系統故障時拿掉主機板上的電池,進行CMOS放電操作,從而還原BIOS設定。
既然它只是個RAM(不是昂貴的NvRAM非易失性儲存器,也沒必要用NvRAM),那麼就得給它一直供著電,否則掉電後資料就丟了。但是我們的電腦不能總開著機一直耗電玩,所以就必須得有一個後備電源準備著隨時在電腦電源關閉後“接班”為CMOS晶片供電,好吧,放個3V鋰電池就行了,所以主機板上那個電池是為CMOS晶片在電腦電源關閉後繼續供電的東西。
BIOS 與CMOS
BIOS是個程式,實現一系列功能,該程式儲存在晶片中,這個晶片叫做BIOS晶片;而CMOS也是個晶片,是個RAM,裡面存的是電腦硬體配置資訊和電腦其他有關的東西,電腦啟動了就由電腦電源為其供電,電腦關閉則由一個後備電池供電保證資料不丟失。
那麼CMOS既然是RAM,裡面的東西就能夠進行修改,用什麼軟體對CMOS修改呢?需要用CMOS設定程式,而這個設定程式又在哪裡?好,請返回去看BIOS的第三條功能——CMOS設定程式,所以CMOS的設定程式是BIOS本身的一個功能,於是乾脆就把它簡單稱作“BIOS設定”或者叫“CMOS設定”。
大眾的bios版本:
NOR Flash是非易失性儲存器(NvRAM)的一種標準,其實它基本和上面那幾個ROM標準誕生在同一時期,但是應用在BIOS晶片上則是最後的,NOR Flash由於是NvRAM的標準,可以在普通情況下任意擦除或寫入,所以不再需要加程式設計電壓。此外,NvRAM還可以實現大容量的儲存,對於BIOS的後繼UEFI是優點之一。還有NvRAM在擦除時是以一個塊(Block)為單位進行整體擦除的,塊是由晶片廠商人為規定的位元組數,肯定不會是一個位元組,因此擦除速度會很快,寫入仍然按照一位元組為單位,而且寫入和擦除是分步進行的,只有確定全部塊都擦除完畢才會進行寫入操作,這些特點使得NOR Flash成為目前最大眾的BIOS晶片。
為什麼BIOS程式更新後,需要重新執行CMOS設定程式設定CMOS引數?原來在升級BIOS程式過程中,原有BIOS內容已經被逐漸清掉,所以這時CMOS雖然還有硬體配置資料,但已經是無用的垃圾資料。所以就需要重新執行CMOS程式設定電腦引數並儲存,則CMOS的硬體資訊就和BIOS中的CMOS設定一致了,再次啟動發現一致則繼續完成後續過程,直到將引導交給OS,OK,本次BIOS更新成功完成
總結如下:BIOS是一個程式,存在BIOS晶片中,而CMOS是一個整合在南橋的晶片,存的是電腦硬體配置資訊,若想更改並儲存起來,就需要用BIOS程式中的CMOS設定程式對其進行設定。
BIOS程式可以分為若干模組,主要有Boot Block引導模組、CMOS設定模組、擴充套件配置資料(ESCD)模組、DMI收集硬體資料模組,其中引導模組直接負責執行BIOS程式本身入口、計算機基本硬體的檢測和初始化,ESCD用於BIOS與OS交換硬體配置資料,DMI則充當了硬體管理工具和系統層之間介面的角色,通過DMI,使用者可以直觀地獲得硬體的任何資訊,CMOS設定模組就是實現對硬體資訊進行設定,並儲存在CMOS中,是除了啟動初始化以外BIOS程式最常用的功能。
BIOS本身是組合語言程式碼,是在16位真實模式下呼叫INT 13H中斷執行的,由於x86-64是一個高度相容的指令集,也為了遷就BIOS的16位真實模式的執行環境,所以即使現在的CPU都已是64位,如果還是在BIOS啟動(基本見於09年以前的主機板),在開機時仍然都是在16位真實模式下執行的。16位真實模式直接能訪問的記憶體只有1MB,就算你安了4G、8G或者16G還是32G記憶體,到了BIOS上一律只先認前1MB。在這1MB記憶體中,前640K稱為基本記憶體,後面384K記憶體留給開機必要硬體和各類BIOS本身使用,瞭解了這些,下面談一下BIOS啟動計算機的具體過程。
BIOS啟動計算機的具體過程:
當按下電源開關時,電源就開始向主機板和其他裝置供電,這時電壓還不穩定,在早期的南北橋主機板上,由主機板北橋向CPU發覆位訊號,對CPU初始化;穩定電壓後復位訊號便撤掉。而對於現在的單南橋主機板,則由CPU自身調整穩定電壓達到初始化的目的,當電壓穩定後,CPU便在系統BIOS保留的記憶體地址處執行跳轉BIOS起始處指令,開始執行POST自檢。
在POST自檢中,BIOS只檢查系統的必要核心硬體是否有問題,主要是CPU、640K基本記憶體、顯示卡是否正常,PS/2鍵盤控制器、系統時鐘是否有錯誤等等。由於POST檢查在顯示卡初始化以前,因此在這個階段如發生錯誤,是無法在螢幕上顯示的,不過主機板上還有個報警揚聲器,
POST自檢結束後,BIOS開始呼叫中斷完成各種硬體初始化工作。
硬體初始化工作中,主要說明兩點,首先經過POST檢測後,電腦終於出現了開機啟動畫面,這就是已經檢測到了顯示卡並完成了初始化。
第二,BIOS只識別到由主引導記錄(MBR)初始化的硬碟,之所以說明這點,是因為後續的EFI或UEFI採用了一種新的GUID磁碟分割槽系統(GPT)格式,這種硬碟在BIOS下是無法識別的。硬體全部初始化完畢後,接下來進入更新ESCD階段。
在ESCD更新階段中,BIOS將對儲存在CMOS中和作業系統交換的硬體配置資料進行檢測,如果系統硬體發生變動,則會更新該資料,否則不更新保持原狀不變,ESCD檢測或更新結束後,BIOS將完成最後一項工作,就是啟動作業系統。
最後這一步中,BIOS根據CMOS中使用者指定的硬體啟動順序,讀取相應裝置的啟動或引導記錄,引導相應裝置上的作業系統啟動,進入作業系統,此後便由作業系統接替BIOS負責硬體和軟體間的相互通訊。如果發現所有硬體都沒有能引導作業系統的記錄,則會在螢幕上顯示相應錯誤資訊,並將電腦維持在16位真實模式。
雖然BIOS作為電腦加電啟動所必不可少的部分,但是從其於1975年誕生之日起近30餘年,16位組合語言程式碼,1M記憶體定址,呼叫中斷一條條執行的理念和方式竟然一點都沒有改變
總結:bio作為一個程式,是基於16位編碼的,也就是它的定址能力只有1mb,只能識別1mb的記憶體,而這1mb的記憶體,前640k為基本記憶體,後384k儲存的是各種bios程式本身和開機硬體。
首先初始化cpu,使cpu跟據bios儲存的指令來進行post自檢,就是檢測核心硬體是否有問題,在自檢結束後,進行硬體初始化,在這之後設定cmos中的資料使之一致,再然後就可以啟動作業系統了,讓作業系統來管理硬體和軟體。
UEFI
UEFI全稱“統一的可擴充套件韌體介面”,是一種詳細描述型別介面的標準。
UEFI是由EFI1.10為基礎發展起來的,它的所有者已不再是Intel,而是一個稱作Unified EFI Form的國際組織
與legacy BIOS 相比,UEFI最大的幾個區別在於:
- 編碼99%都是由C語言完成;
- 一改之前的中斷、硬體埠操作的方法,而採用了Driver/protocol的新方式;
- 將不支援X86真實模式,而直接採用Flat mode(也就是不能用DOS了,現在有些 EFI 或 UEFI 能用是因為做了相容,但實際上這部分不屬於UEFI的定義了);
- 輸出也不再是單純的二進位制code,改為Removable Binary Drivers;
- OS啟動不再是呼叫Int19,而是直接利用protocol/device Path;
- 對於第三方的開發,前者基本上做不到,除非參與BIOS的設計,但是還要受到ROM的大小限制,而後者就便利多了。
7.彌補BIOS對新硬體的支援不足的問題。
優點:
它運行於32位或64位模式,突破了傳統16位程式碼的定址能力,達到處理器的最大定址,此舉克服了BIOS程式碼執行緩慢的弊端。
一個顯著的區別就是EFI BIOS是用模組化,C語言風格的引數堆疊傳遞方式,動態連結的形式構建的系統,
1.相容性
與BIOS不同的是,UEFI體系的驅動並不是由直接執行在CPU上的程式碼組成的,而是用EFI Byte Code(EFI位元組程式碼)編寫而成的。Java是以“Byte Code”形式存在的,正是這種沒有一步到位的中間性機制,使Java可以在多種平臺上執行。UEFI也借鑑了類似的做法。EFI Byte Code是一組用於UEFI驅動的虛擬機器器指令,必須在UEFI驅動執行環境下被解釋執行,由此保證了充分的向下相容性。
一個帶有UEFI驅動的擴充套件裝置既可以安裝在使用安卓的系統中,也可以安裝在支援UEFI的新PC系統中,它的UEFI驅動不必重新編寫,這樣就無須考慮系統升級後的相容性問題。基於解釋引擎的執行機制,還大大降低了UEFI驅動編寫的複雜門檻,所有的PC部件提供商都可以參與。
2.滑鼠操作
UEFI內建圖形驅動功能,可以提供一個高解析度的彩色圖形環境,使用者進入後能用滑鼠點選調整配置,一切就像操作Windows系統下的應用軟體一樣簡單。
3.可擴充套件性
UEFI將使用模組化設計,它在邏輯上分為硬體控制與OS(作業系統)軟體管理兩部分,硬體控制為所有UEFI版本所共有,而OS軟體管理其實是一個可程式設計的開放介面。藉助這個介面,主機板廠商可以實現各種豐富的功能。比如我們熟悉的各種備份及診斷功能可通過UEFI加以實現,主機板或韌體廠商可以將它們作為自身產品的一大賣點。UEFI也提供了強大的聯網功能,其他使用者可以對你的主機進行可靠的遠端故障診斷,而這一切並不需要進入作業系統。
目前UEFI主要由這幾部分構成:UEFI初始化模組、UEFI驅動執行環境、UEFI驅動程式、相容性支援模組、UEFI高層應用和GUID磁碟分割槽組成。
UEFI初始化模組和驅動執行環境通常被整合在一個只讀儲存器中,就好比如今的BIOS固化程式一樣。UEFI初始化程式在系統開機的時候最先得到執行,它負責最初的CPU、北橋、南橋及儲存器的初始化工作,當這部分裝置就緒後,緊接著它就載入UEFI驅動執行環境(Driver Execution Environment,簡稱DXE)。當DXE被載入時,系統就可以載入硬體裝置的UEFI驅動程式了。DXE使用了列舉的方式載入各種匯流排及裝置驅動,UEFI驅動程式可以放置於系統的任何位置,只要保證它可以按順序被正確列舉。藉助這一點,我們可以把眾多裝置的驅動放置在磁碟的UEFI專用分割槽中,當系統正確載入這個磁碟後,這些驅動就可以被讀取並應用了。在這個特性的作用下,即使新裝置再多,UEFI也可以輕鬆地一一支援,由此克服了傳統BIOS捉襟見肘的情形。UEFI能支援網路裝置並輕鬆聯網,原因就在於此。
值得注意的是,一種突破傳統MBR(主引導記錄)磁碟分割槽結構限制的GUID(全域性唯一標誌符)磁碟分割槽系統將在UEFI規範中被引入。MBR結構磁碟只允許存在4個主分割槽,而這種新結構卻不受限制,分割槽型別也改由GUID來表示。在眾多的分割槽型別中,UEFI系統分割槽用來存放驅動和應用程式。
主引導記錄(MBR,Main Boot Record)是位於磁碟最前邊的一段引導(Loader)程式碼。它負責磁碟作業系統(DOS)對磁碟進行讀寫時分割槽合法性的判別、分割槽引導資訊的定位,它由磁碟作業系統(DOS)在對硬碟進行初始化時產生的。
OpenSSL是眾所周知的SSL和TLS協議的開源實現。核心庫實現了基本的加密函式,並提供了各種加密函式實用函式。OpenSSL庫廣泛用於各種安全性產品開發作為基礎密碼提供商。
EDKII模擬器平臺
EDKII是一個開源的 UEFI bios 的釋出框架,它裡面包含了各種具有依賴關係的功能模組,描述檔案和底層庫函式。韌體生成工具可以根據開發原始碼自動構建適用於不同架構平臺的韌體。UDK2015是EDK II專案的一個穩定版本。
EDKII模擬器平臺介紹
一個模擬平臺並不是一個實際的硬體平臺,但它旨在證明EDKII核心模組的穩定性和獨立於硬體可以開發模組。模擬平臺和實際平臺之間的差異是其載入器和模擬的硬體裝置。
EDKII提供三種模擬器平臺:Nt32, Unix and Duet platforms。本試驗中使用的是Nt32。
Nt32是32位Windows作業系統下提供UEFI執行環境的模擬器。
SecMain模組[\Build\NT32IA32\DEBUG_VS2013x86\IA32\SecMain.exe]是Nt32平臺載入器,是Windows可執行程式。
Nt32建立了模擬硬體環境,如分配Windows記憶體為Nt32平臺來模擬系統的記憶體,對映FD(Flash Description Files)檔案到Windows的記憶體區域來模擬Flash裝置。
之後,SecMain程式呼叫PeiCore[Pre-EFI Initialization]作為實際的平臺入口移交給PEI[Pre-EFI Initialization],UEFI的第二個啟動階段]階段。
也就是說,上者是模擬的執行環境,而vs是使用的工具。