傳統BIOS開機流程

從你按下主機機殼上的電源鍵,到進入作業系統的期間,儲存於主機板上那顆EEPROM(電氣可抹除暨可程式化唯讀記憶體)裡的BIOS便會開始執行以下的工作:

1. 初始化:

當電腦打開,CPU會自行重置為初始狀態,準備運作。BIOS boot block(基本輸出輸入系統開機區塊)初始化階段啟動,因為此時系統記憶體中是空的,沒有內容可以執行,所以廠商讓CPU去尋找系統BIOS ROM中的reset vector(重置向量):用一個固定的位置來啟動所謂的BIOS boot program開機程式。

一般來說程式會在記憶體的FFFF0h位址,也就是在UMA(上層記憶區域)靠結尾的地方。為避免ROM大小改變造成相容性的問題,所以一般會選擇 放這裡。它的內容只有一個jump指令,進一步跳到真正的BIOS啟動程序。當然了,各家IBV (independent BIOS vender;獨立BIOS供應商)可以把程式放在不同的位置,只要透過jump來指定就可以了。

在這段期間,系統的CPU、晶片組、Super I/O和USB只有部分初始化,僅獲取足夠資料來應付萬一BIOS開機失敗,可以利用軟碟(由Super I/O控管)甚至是光碟(由晶片組的IDE/SATA)等儲存媒體來救援BIOS的boot block。

2. POST(Power On Self Test;開機自我檢測):

然後BIOS開始施行Power-On Self Test(POST;開機自我檢測),在過程中檢查電腦各項組件及其設定,像是:中央處理器、主記憶體、鍵盤、滑鼠等等狀態。接著便尋找被內建在BIOS內部的顯示卡程序並執行。

它通常被放在記憶體C0000h的位置,作用是顯示卡的初始化,而大部分的顯示卡都會在顯示器上顯示其相關訊息。這就是為何各位在開機的時候,首先會在顯示器的畫面左上角出現有關顯示卡訊息的原因。

再下來就是讓BIOS尋找其他裝置的ROM(唯讀記憶體),看看這些設備中哪些還有個別的BIOS。如果這時有找到任何其它裝置的BIOS,它們也會被執行。

下一步BIOS會顯示啟動畫面,並開始更深入的檢測,包含我們平常可以在螢幕上看到的記憶體容量檢測。如果這時候遇到任何錯誤,就會在畫面上顯示錯誤訊息。

3. 記錄電腦系統的設定值:

到這裡還沒有結束,再來BIOS會根據自己的「系統資源表」,來對系統進行進一步的確認,看看你的電腦究竟安裝了那些系統資源或設備。有些電腦會逐 步顯示這些被偵測到的設備。例如BIOS支援隨插即用,那它將會偵測和配置隨插即用裝置,並顯示由BIOS偵測到的隨插即用設備。

在這些檢測結束後,BIOS會打出一個偵測總結表於畫面上。而這個總結表在部分IBV的設定中是可以讓使用者開啟或關閉的。當然也有些IBV為加速開機把這一步直接隱藏省略。

Tips:BIOS boot block

在快閃唯讀記憶體內,通常會分成兩個區塊,一個區塊存放一般的BIOS程式碼,即所謂的code block(程式碼區塊);另一個區塊則是存放用來開機(或急救)的程式碼,就是所謂的boot block(開機區塊)。當電源打開時,主機板會先從boot block執行,它會立即檢查code block 的程式碼是否正確,如果正確,就會轉到code block 繼續執行下去。而所謂的BIOS recovery(BIOS回復)就是利用boot block回寫動作來進行BIOS更新失敗時的救援。

4. 提供常駐程式:

提供作業系統或應用程式呼叫的中斷向量,如INT 10h(VGA圖形及文字輸出中斷)等。

5. 載入作業系統:

到這裡是系統檢測的部分,接下來BIOS便開始尋找開機裝置,使用者可以透過在BIOS的設定來決定搜尋順序,目前常見的開機設備至少包含FDD、HDD以及光碟機和USB開機裝置等多項。

找到開機裝置後,BIOS將會搜尋開機訊息以進行作業系統的開機過程。如果是找到了一個灌好OS的硬碟,它將會尋找位在硬碟第0面,第0軌,第1磁 區裡的Master Boot Record(主要開機磁區)。如果它找到的是FDD,也會讀取軟碟的第1磁區。再把讀取到的資料放在記憶體7C00h的位置,跳到那裡並且執行它。自此 才開始進入OS啟動階段。

UEFI BIOS系統的開機流程

同樣是進行電腦系統的開機,由於UEFI BIOS是遵循UEFI論壇的規範定義下開發的,所以UEFI的開機流程會像下圖一般:

1. SEC階段:

SEC(安全性)階段其主要的特色為「cache as RAM」,即處理器的快取當成記憶體。由於C語言需要使用堆疊,在這個階段的系統記憶體尚未被初始化,在沒有記憶體可用的情況下,便把處理器的快取當成記 憶體來使用,在主記憶體被初始化之前來進行預先驗證CPU/晶片組及主機板。

因為這時侯沒有快取,會導致處理器的效能變得較差,所以在記憶體初始化完畢之前,SEC和PEI階段的程式碼越簡短,越能減少這個副作用。

2. PEI階段:

和傳統BIOS的初始化階段類似,PEI(EFI前初始化)階段是用以喚醒CPU及記憶體初始化。這時候只起始了一小部分的記憶體。同時,晶片組和 主機板也開始初始化。接下來的服務程式會確定CPU晶片組被正確的初始化,在此時,EFI驅動程式派送器將載入EFI驅動程式記憶體,進入了起始所有記憶 體的DXE階段(驅動程式執行環境)。

3. DXE階段:

DXE的主要功能在於溝通EFI驅動程式及硬體。也就是說此階段所有的記憶體、CPU(在此是指實體兩個或以上的非核心數目,也就是雙CPU插槽處理器甚至是四CPU插槽處理器)、PCI、USB、SATA和Shell都會被初始化。

4. BDS階段:

在BDS(開機設備選擇)這個階段,使用者就可以自開機管理者程式頁面,選擇要從哪個偵測到的開機設備來啟動。

5. TSL階段:

然後進入TSL(短暫系統載入)階段,由作業系統接手開機。除此之外,也可以在BDS階段選擇UEFI Shell,讓系統進入簡單的命令列,進行基本診斷和維護。

傳統BIOS哪裡不好?

在繼續探討何謂UEFI BIOS之前,先來看看傳統BIOS有哪些問題,讓Intel決心帶頭推出UEFI BIOS。

1. 過時的16位元模式

在x86系列CPU進入32位元的時代,為了相容性考量,當時最新的80386 CPU保留了16位元的執行方式,即真實模式(real mode)。在後來多次的CPU改朝換代中都保留了這種執行方式,甚至在含有EM64T的Xeon系列CPU中,供電到CPU啟動時仍然會切換到16位元 的真實模式下執行。

也就是說,雖然各大BIOS廠商為了配合潮流演進,將許多新功能新元素添加到產品中,但BIOS在本質上沒有任何改變。迫使Intel在開發更新的CPU時,都必須加進會使效能大大降低的相容模式。

2. 只有1MB定址空間

各位讀者如果有注意傳統BIOS開機,在POST完畢後螢幕上打出的系統摘要表,會發現記憶體欄位標示著「Base Memory=640KB」。加上前一篇提到的384KB UMA(這裡的記憶體不會列入Base Memory),就是所謂1MB可定址記憶體空間。

會造成這項限制,主要還是真實模式的副作用。16位元的CPU,其定址能力為20條定址線所能處理的2^20位元組(Bytes),也就是1024千位元組(KB)。換句話說,在進入OS之前的開機階段,即使安裝了高達4GB的記憶體,絕大部分都無法使用。

3. 組合語言難維護

假設某天你買了一張高階工作站主機板,再裝上一張SCSI或SAS的磁碟陣列卡,竟然發現安裝後你的主機板開機開不下去,然後顯示「Not enough space to copy PCI option ROM」或「Option ROM memory space exhausted」警告字串。然後本來你那雀躍快樂的心情消失了,取而代之的是「歸LP火」熊熊燃燒著。

當你打電話給陣列卡商,電話那頭的死公務員聲音說著:「你要不要問問主機板廠有沒有新的BIOS?」。 好不容易找上主機板廠商客服問:「你們有沒有辦法解決?」然後,你和主機板BIOS工程師之間的攻防就此展開。

對板卡廠的BIOS工程師而言,除非剛好有下單下很大的客戶遇到類似相關問題,否則很有可能就是不了了之。你只好趁購買七天內退掉那張陣列卡,不然就是再找一張可以正常搭配的主機板。

由於傳統BIOS是用組合語言編寫的,而軟體界早就已經是C/C++高階語言甚至是.NET滿天飛,為了相對難找的人才(組合語言高手相對少,要BIOS真正寫得好的更是少數)來減緩新產品上市的速度,不管是消費者或廠商都無法接受。

此時UEFI BIOS標準化和模組化的特徵,便可加速產品推出和減少debug的時間。另外C語言寫的UEFI BIOS體積也會變大,連帶使儲存BIOS的EEPROM需要擴增。

別忘了,這也是Intel的勢力範圍,如果EFI BIOS推廣成功,板卡廠就得多採購一顆晶片。

▲ 由於傳統BIOS的先天侷限,有時候磁碟陣列卡就是裝不上去。

4. 十年不變的程式碼

上述三大問題是以開發廠商的角度來觀察。其他隱而不現的部分,則包含了功能的侷限性和對使用者不夠友善的操作介面。對照現今的視窗介面作業系統,傳統BIOS以文字介面為主且充滿著火星文,加上除了單純的開機,作為仲介硬體初始化和作業系統的功能外實在陽春的可憐。

在開發Itanium CPU之際,業界大魔王Intel實在不想再受制於這些顧慮。試想,既然這是一個新生的CPU架構,那系統韌體和作業系統之間的介面就順便一起重新定義。

並且這一次,Intel為了讓以後各種新的規格和技術可以快速導入,嚴格定義這個傳統BIOS接班人必須具有擴展彈性,而且採取標準化的韌體介面規範,以避免發生傳統BIOS的IBV程式碼更新太被動的問題。

筆者不是開玩笑,業界之前盛傳一句話,如果Award BIOS當時(Intel Pentium處理器時代)沒有華碩,那肯定沒有後來功能齊全的BIOS程式編碼。傳統BIOS靜態連結,缺乏遠見且疊床架屋,而幾乎全基於經驗和約定的 見招拆招。所以才有2000年開發出來所謂的EFI(Extensible Firmware Interface;可擴展韌體介面)技術作為工業標準規格,定義了一個驅動介面,用以溝通硬體/韌體和作業系統。

UEFI的版本發展

最初制定的EFI版本2000年12月的1.02版。在2002年的12月又釋出了加入EFI驅動程式模型的1.10版。於2005年,Intel 將此規格提供給負責UEFI開發和推廣的UEFI論壇。為了反映這點,EFI也被更名為UEFI。在大部分的文件資料中,EFI和UEFI講的是一樣的東 西。

UEFI論壇在2007年1月釋出2.1版的規範。目前最新公開的版本就是2009年5月發佈的2.3版。概括而論,凡依照UEFI論壇規範,使用C語言寫作的BIOS即為UEFI BIOS。

UEFI論壇成員類別
IBV(獨立BIOS 廠商) AMI、Insyde、Phoenix
IHV(獨立硬體廠商) AMD、Apple、Dell、HP、
IBM、Intel、聯想
ISV(獨立軟體廠商) 微軟

 

UEFI BIOS哪裡好?

UEFI是藉由UEFI論壇制定的嚴謹規範來達成標準化,並用模組化之C語言方式的參數堆疊傳遞,藉由動態連結形式所建構出來的系統,相較於使用組 合語言的傳統BIOS更易於實作,在容錯和錯誤更正的表現上更加優良,更好開發。UEFI是以32或64位元CPU保護模式執行(也稱為Flat Mode),突破傳統16位元代碼的定址能力,可達到CPU的最大定址空間。

1. 定址空間更彈性

UEFI BIOS利用載入EFI driver的形式,來進行硬體的辨識/控制及系統資源掌控。

傳統BIOS是以真實模式中斷向量的方式增加硬體功能。它要將一段類似於驅動程式的16位元代碼,放置在記憶體0x000C0000至 0x000DFFFF之間。這段記憶體空間有限(128KB),因此,當必須放置的option ROM超過128KB時,傳統BIOS便無能為力。

很多時候傳統BIOS的工程師為了解決這類問題,像剛剛提到的介面卡BIOS容量過大,便要想辦法利用可能的排列組合硬擠出空間來放驅動代碼。而重 組過程有時不小心造成一些副作用,例如才剛解決的bug,重組後又再發生!也就是說,UEFI BIOS可以更有系統的分配儲存空間,避免使用強制定址。

2. 什麼系統都能用

另外,傳統BIOS的硬體服務程式都是以16位元代碼的形式存在,在增強模式下執行的作業系統想存取這些服務會有困難。因此BIOS提供的服務在現實中只能提供給MS-DOS之類的系統用。

相對的,UEFI系統下的驅動並不是可以直接在CPU執行的代碼,而是用EBC(EFI Byte Code)這種專用於EFI driver的虛擬機器指令,該指令必須在UEFI的DXE階段被解壓縮後翻譯執行。

如此便有更佳的向下相容性,因為EFI driver是彈性的驅動程式模組架構,可不斷的擴充驅動程式及介面,不用重新編寫,所以就無需考慮因系統升級所衍生的相容性因素。

3. 開發維護更容易

加上EFI driver開發簡單,所有的PC零組件廠商都可以參與,就像現代作業系統的開發模式,這樣的模式曾使Windows系統短短幾年就變得無比強大。有了 EFI driver,也可以讓顯示卡在開機階段就載入某種程度的功能,進而可以把傳統文字介面為主的BIOS轉成圖形介面。

4. 精簡系統用途大

最後還有EFI Shell,這是個精簡的作業系統,可以讓使用者進行BIOS的更新、系統診斷、安裝特定軟體。有了UEFI BIOS甚至可以播放CD和DVD而不需完全載入OS,EFI driver可以被載入或卸載,連TCP/IP核心程式都可以使用。基於EFI的driver model可使UEFI系統接觸到所有的硬體功能,在進入作業系統之前瀏覽網站不再是天方夜譚,甚至實作起來也非常簡單。總之,對使用者而言,多了一個方 便的環境以及華麗的圖形介面,是最明顯的好處。

傳統BIOS vs. UEFI BIOS重點差異
BIOS種類 傳統BIOS UEFI BIOS
程式語言 組合語言 C語言
資源控制 中斷向量
寫死的記憶體存取
寫死的輸出/輸入存取
驅動程式/協定
處理器運行環境 X86 16位元 CPU保護模式
擴充方式 接合中斷向量 載入驅動程式
第三方IHV和ISV支援性 較差 較佳且可以支援多平台
圖形化能力 較差 較佳
內建簡化的作業系統前環境

有誰在用UEFI?

UEFI支援必須藉由軟硬體的相互合作來達成,我們來看看目前市面上流通的產品中,哪些已經採用了UEFI。

支援UEFI的硬體

1. 2006年,蘋果電腦推出第一台使用Intel處理器架構的麥金塔電腦。從此開始用EFI/UEFI framework,而非以往搭載IBM PowerPC處理器的麥金塔電腦用的、發源於Sun Microsystems(昇陽電腦公司)的Open Firmware。

▲ 目前新版的Mac OS X都已經支援UEFI。

2. Intel自家的行動型、桌上型和伺服器電腦主機板自2006年起開始全面轉換為EFI/UEFI BIOS。例如從945系列晶片組開始,Intel的主機板就已經使用了該framework。

3. 此外,2008年開始,許多64位元電腦系統也正式支援EFI/UEFI BIOS。如IBM的x3450伺服器、微星科技具備ClickBIOS的主機板(包括下一篇介紹的EFINITY主機板)、HP筆記型電腦 EliteBook系列和平板電腦、HP Compaq筆記型電腦較新的機種。

▲ 微軟到了Windows Server 2008才開始支援UEFI。

支援UEFI的作業系統

1. 早在2000年,Linux作業系統便可以支援EFI,當時是elilo EFIboot loader(開機載體),演化至今是EFI版本的grub。

2. 蘋果電腦到了Mac OS X 10.4(代號Tiger)的Intel版便可以支援EFI。

3. 2002年微軟給Itanium CPU使用的Windows 2000 Advanced Server Limited Edition及Datacenter Server Limited Edition版支援了EFI v1.10規範。後來的Windows Server 2003 for IA-64版和Windows XP 64-bit版本也支援EFI。至於UEFI的支援是從Windows Server 2008和Vista SP1的64位元版本開始,包括Windows 7也只有64位元版完整支援UEFI。

▲ Intel自家的D945PSN主機板。

微星EFINITY主機板實戰

▲ 微星科技所推出的EFINITY主機板。

這張主機板是採用Intel P35北橋加上ICH9南橋晶片組的產品。截稿時的市價落在新台幣兩千五以下。由於ICH9南橋沒有內建IDE控制器,所以微星另外安裝了一個智微科技的JMB363控制晶片。

主機板上貼有IBV的貼紙,我們可以從這張貼紙上看到微星的UEFI BIOS是由美商AMI所提供來源碼,AMI將這個UEFI BIOS產品稱做Aptio。

微星會跟AMI拿Aptio來開發第一次的UEFI BIOS並不令筆者意外,因為早在Intel當初制定EFI的時候,AMI和系微(Insyde)就是跟Intel合作的元老級成員。國內許多正在往 UEFI BIOS切入的廠商,為了產品成熟度和減短產品開發時間,都以AMI為主要合作伙伴,而筆記型電腦則有不少跟系微合作。

至於以前在Pentium時代吃香喝辣的Phoenix-Award,這回就沒那麼好命。俗話說的好,風水輪流轉,果然沒錯!

EFINITY主機板細部圖解

▲ 智微科技的JMB363控制器走PCI-E x1的頻寬,提供一個PATA和兩個SATA II連接埠,支援RAID 0、1、0+1和JBOD,另外也支援兩個eSATA 。

▲ 網路功能的部分,是採用了瑞昱半導體的RTL8111B控制器,支援10/100/1000快速乙太網路。

▲ 音效控制晶片是透過瑞昱半導體的ALC888控制器負責。

▲ Super I/O則是由精拓科技的F71882F G所提供,並可以進行硬體監控。

▲ EFINITY是採用美商安邁科技股份有限公司的Aptio UEFI BIOS來源碼。

UEFI介面功能體驗

將EFINITY主機板測試系統開機,我們看到了一貫的logo畫面,再來便是圖像式的BIOS介面,接著進入設定畫面,很簡潔的分成6種語言可供 選擇。 當滑鼠游標進入畫面的時候便可以點選選單。跳脫了以往傳統BIOS的純文字介面。當在地化被喊得震天價響的時代,我們也不能免俗來看看中文選單提供的功 能。包括了系統狀態、Cell Menu、晶片組設定、開機設定、密碼設定、ENFINITY Extras及儲存和離開等選項。

可惜,剩兩個Cell Menu和ENFINITY Extras沒翻中文,筆者建議前者翻成動態超頻選單,後者譯為特別功能區。此外,這個BIOS的翻譯部分有蠻多缺陷,筆者在此呼籲,希望微星在BIOS 釋出之前能有更嚴謹的品管,這樣才不會辜負UEFI圖像式BIOS提供多國語系共存的苦心。

另外,如果想看EFINITY Extras的選單還提供哪些特別的撒必死,可能會有點失望。因為很可惜的是,微星並沒有把附贈功能存入額外的Flash EEPROM,導致還要另外讀取光碟資料,讓使用者無法深刻體會UEFI BIOS的強大,建議以後的版本可以考慮改變做法。

▲ 怪怪的英文:「Power by EFI BIOS」,應該是「Powered by EFI BIOS」。

▲ EFINITY的BIOS提供了英文、簡體中文、韓文、德文、繁體中文和日文的6種文字選單。

測試平台摘要
主機板 微星EFINITY(BIOS版本1.7)
中央處理器 Pentium D 925
記憶體

宇瞻DDR2-800 1GB x2(美光顆粒)

啟用EFI Shell主控台

由於EFI Shell可以辨識並載入的儲存媒體是FAT32格式,所以筆者的隨身碟被辨識為fs0。如果有接其他FAT32儲存媒體,系統便會依序列出fs1、 fs2⋯⋯。想切換到隨身碟下,只要在提示符號後輸入「fs0」就可以了。另外底下列出一些常見的指令供大家參考。

EFI Shell常用指令
輸入指令 代表的意義
cd 顯示或更改目前的目錄
cls 清除螢幕畫面
comp 比較兩份檔案的內容
date 顯示目前的日期或設定系統的日期
dmem 顯示記憶體的內容
edit 全螢幕編輯ASCII或Unicode檔案
exit 離開EFI Shell
help 顯示指令清單或一個指令的意義
ls 顯示檔案清單及在目錄中的子目錄
map 顯示或定義對映(儲存)裝置
memmap 顯示記憶體分佈對映
pci 顯示PCI裝置設備
reset 系統重置
time 顯示目前時間或設定系統時間
type 顯示檔案的內容
ver 顯示版本資訊

EFI所用的指令和常見的DOS或Linux指令幾乎完全一樣,可以讓我們進行一些基本的檔案維護或系統資料的查詢。 除了輸入指令,如果各位去逛逛UEFI論壇的官方網站,可以看到有驗證規範的工具程式可以下載,只要點選網頁的UEFI Specifications and Tools即可。

試跑UEFI驗證測試

各位進入下載的網頁,可以下載最新版PI-SCT(PlatformInitialization Self-Certification Test;平台初始化自我認證測試)來試著在UEFI的Shell下來跑看看驗證的部分。

這個驗證程式在跑的過程中會重開機,所以在開始跑這個項目之前請各位把BIOS中的開機順序第一個設定為「Built-In EFI Shell」。而解壓縮後的PI-SCT,要事先修改SctStartup.nsh,微星EFINITY跑的是x64的程式碼,而非較早期EFI 1.10規範的IA32程式碼,所以要把sct.efi主程式路徑指向x64目錄。

改好的SctStartup.nsh命名為Startup.nsh放進隨身碟或光碟根目錄,讓程式運行的時候方便找到檔案位置。 另外,上面的官網裡也有最新的UEFI 2.2版官方資料,內容陳述所有該版本中的協定。有興趣的讀者可以一併下載回來,跟跑完的PI-SCT記錄檔好好比對。

跑這些協定驗證的目的在於證明前面我們提到的嚴謹性,從記錄檔中的「PASSED」和「FAILED」,就能知道這張主機板符合多少UEFI 2.2版制訂的規範,如果沒辦法通過驗證工具測試,那充其量不過是張有圖形介面的傳統BIOS罷了!

▲ 在BIOS畫面選擇「儲存及離開」,將啟動等級選為「Built-In EFI Shell」。

▲ 接下來畫面上會出現EFI Shell。

▲ 找到SctStartup.nsh檔,將圖中的區域改成上面的執行路徑。

▲ 等程式跑完,便會顯示通過了哪些測試。

UEFI的未來

從各大IBV及軟硬體龍頭,都替這個新一代BIOS技術抬轎的情況來看,讀者們將會在可預見的未來,看到越來越多主機板甚至介面卡的BIOS或韌體,採用符合UEFI規範的方式來編寫和製作。

有了圖形化的介面,UEFI BIOS既可以讓使用者享受更親和的操作環境,又能夠在不進入OS的情況下進行一些基本操作。對廠商而言,模組化好維護的BIOS編碼及相對容易尋找的C語言編寫人才,更可以加速產品開發時程。對消費者和廠商都是雙贏。

希望能有機會看到更多廠商在這塊進化的BIOS領域耕耘,讓大家都能享受到更好用的產品。微星對這項新技術的努力值得嘉許,但是類似的功能,華碩利 用傳統BIOS也能成功實踐,就是該公司所謂的ExpressGate。 由此看來,微星最好進一步加入更多實用的功能,才能在使用者的心目中獲得壓倒性的勝利。

資料來源:http://www.techbang.com.tw/posts/4356-fully-understand-uefi-bios-theory-and-actual-combat-1-liu-xiudian

arrow
arrow
    全站熱搜

    jakonson 發表在 痞客邦 留言(2) 人氣()