張遠(yuǎn)虎,相明瓊,吳猷,楊勇
基于UEFI規(guī)范的BIOS多線(xiàn)程運(yùn)行機(jī)制研究與設(shè)計(jì)
張遠(yuǎn)虎,相明瓊,吳猷,楊勇
對(duì)基于UEFI規(guī)范的 BIOS(簡(jiǎn)稱(chēng)UEFI BIOS)的運(yùn)行環(huán)境,執(zhí)行流程及其框架結(jié)構(gòu)進(jìn)行了詳細(xì)分析;基于OS下的多線(xiàn)程思想,提出了基于UEFI BIOS環(huán)境下的多線(xiàn)程設(shè)計(jì)理念和方案;嚴(yán)格遵循UEFI 標(biāo)準(zhǔn),實(shí)現(xiàn)并驗(yàn)證了基于UEFI的多線(xiàn)程方案,完成了啟動(dòng)過(guò)程中多線(xiàn)程庫(kù)的研究。經(jīng)實(shí)際應(yīng)用驗(yàn)證,方法簡(jiǎn)便,具有較強(qiáng)的實(shí)用性。
UEFI;BIOS;多線(xiàn)程
BIOS(Basic Input Output System[1]),它是計(jì)算機(jī)運(yùn)行的第一個(gè)程序,該程序保存了電腦的詳細(xì)硬件信息,擔(dān)負(fù)著初始化計(jì)算機(jī)硬件,檢測(cè)硬件功能以及引導(dǎo)操作系統(tǒng)的作用。2000年,Intel公司發(fā)明了用以規(guī)范BIOS開(kāi)發(fā)的可擴(kuò)展固件接口(Extensible Firmware Interface,EFI)[2],用以規(guī)范PC固件體系結(jié)構(gòu)、接口和服務(wù)的建議標(biāo)準(zhǔn)。之后,業(yè)界多家著名公司制定了新的國(guó)際標(biāo)準(zhǔn)UEFI規(guī)范,基于UEFI規(guī)范的 BIOS又稱(chēng)為UEFI BIOS。本文從UEFI BIOS的架構(gòu)著手,分析UEFI BIOS啟動(dòng)的各個(gè)階段,結(jié)合實(shí)例剖析了多線(xiàn)程這項(xiàng)復(fù)雜技術(shù)的設(shè)計(jì)思路和實(shí)現(xiàn)方法。
近年來(lái),計(jì)算機(jī)硬件技術(shù)更新迅速,傳統(tǒng)的 BIOS(Legacy BIOS)技術(shù)由于功能的局限性,已成為技術(shù)進(jìn)步的包袱。目前,最新的UEFI BIOS日趨成熟,其設(shè)置操作均模仿 Windows操作系統(tǒng)下的使用體驗(yàn),支持鼠標(biāo)點(diǎn)擊來(lái)切換菜單、調(diào)整配置選項(xiàng)。下面從擴(kuò)展性和兼容性?xún)煞矫婧?jiǎn)要說(shuō)明遵循UEFI規(guī)范的BIOS相比Legacy BIOS的先進(jìn)性:
(1)高擴(kuò)展性
UEFI BIOS代碼98%以上使用C語(yǔ)言編寫(xiě),內(nèi)置圖形驅(qū)動(dòng)功能,提供強(qiáng)大的連網(wǎng)功能,支持32位或64位運(yùn)行模式,突破了傳統(tǒng)16位代碼的尋址能力,達(dá)到處理器的最大尋址,提高了BIOS代碼的運(yùn)行速度。另一方面,使用模塊化設(shè)計(jì),在邏輯上分為操作系統(tǒng)軟件管理和硬件控制兩部分,操作系統(tǒng)軟件管理提供一個(gè)開(kāi)放的可編程的接口,為系統(tǒng)的后期擴(kuò)展提供了無(wú)線(xiàn)的可能性。以系統(tǒng)診斷功能為例,在不開(kāi)啟操作系統(tǒng)情況下,UEFI BIOS可實(shí)現(xiàn)通過(guò)互聯(lián)網(wǎng)對(duì)計(jì)算機(jī)遠(yuǎn)程故障排查的功能。
(2)良好兼容性
UEFI借鑒了以“Byte Code”形式存在的JAVA語(yǔ)言能夠在多種平臺(tái)上運(yùn)行的編譯模式,從而實(shí)現(xiàn)了基于UEFI規(guī)范的BIOS的良好兼容性。UEFI BIOS的驅(qū)動(dòng)由EFI Byte Code(EFI字節(jié)代碼)編寫(xiě)而成,EFI Byte Code是一組用于UEFI驅(qū)動(dòng)的虛擬機(jī)器指令,必須在UEFI驅(qū)動(dòng)運(yùn)行環(huán)境下被編譯、運(yùn)行,這種中間件機(jī)制使得UEFI BIOS具有更好的兼容性,同時(shí)也降低了UEFI驅(qū)動(dòng)編寫(xiě)的復(fù)雜性,縮短了系統(tǒng)的研發(fā)時(shí)間,降低了計(jì)算機(jī)配件供應(yīng)商的準(zhǔn)入門(mén)檻。
2.1 UEFI框架
UEFI規(guī)范定義了完整的標(biāo)準(zhǔn)接口和數(shù)據(jù)結(jié)構(gòu),UEFI規(guī)范和傳統(tǒng)的BIOS本質(zhì)上是沒(méi)有區(qū)別的,都是為了能夠把不同的硬件平臺(tái)封裝成為操作系統(tǒng)(OS)能夠識(shí)別的統(tǒng)一軟件接口,使得所有的硬件平臺(tái)都能用統(tǒng)一的接口、協(xié)議和服務(wù)展現(xiàn)出來(lái)。從整個(gè)平臺(tái)的架構(gòu)上看,它處于系統(tǒng)抽象層(System Abstract Layer)的地位,多線(xiàn)程服務(wù)在uFFI架構(gòu)中的位置,如圖1所示:
圖1 UEFI系統(tǒng)抽象
從圖1中可知,UEFI是對(duì)整個(gè)硬件平臺(tái)的軟件抽象,它暴露給OS的只有標(biāo)準(zhǔn)的服務(wù)和接口。從軟件架構(gòu)來(lái)區(qū)分,可分成3層[3]:處理器抽象層(PAL,Processor Abstraction Layer)、系統(tǒng)抽象層(SAL, System Abstraction Layer)、可擴(kuò)展固件接口(EFI,Extensible Firmware Interface)。UEFI僅支持單線(xiàn)程,只支持時(shí)鐘中斷,這也是硬件設(shè)備的操作[4]只能使用輪詢(xún)的方式來(lái)操作的根本原因。
2.2 PI(Platform Initialization)規(guī)范
UEFI規(guī)范定義的都是接口,對(duì)于怎么去實(shí)現(xiàn)這些接口該規(guī)范并沒(méi)有做過(guò)多的限制。顯然,通過(guò)程序?qū)崿F(xiàn)這套規(guī)范是很復(fù)雜的。UEFI論壇定義出了平臺(tái)初始化標(biāo)準(zhǔn),被命名為PI(Platform Initialization)。平臺(tái)初始化分階段地把UEFI接口的實(shí)現(xiàn)定義成了7個(gè)階段,他們分別是SEC,PEI,DXE,BDS,TSL,Runtime,AfterLife。PI和uFFI之間的關(guān)系,如圖2所示:
圖2 PI和uEFI關(guān)系
從圖2中可知,整個(gè)PI定義的就想一個(gè)英文字母H的框架。形象地理解為,往這個(gè)框架里面可以填入各個(gè)模塊。經(jīng)過(guò)所有的模塊的運(yùn)行,UEFI包裝并提供了所有的 UEFI規(guī)范中定義的接口和協(xié)議。
UEFI BIOS實(shí)際上是基于Intel的Framework,嚴(yán)格遵循PI標(biāo)準(zhǔn)定義來(lái)搭建整個(gè)UEFI環(huán)境,并向OS提供標(biāo)準(zhǔn)的可擴(kuò)展接口。PI標(biāo)準(zhǔn)定義了SEC,PEI,DXE,BDS,TSL,RT,AL共7個(gè)階段,如圖3所示:
圖3 uEFI的各個(gè)階段示意圖
眾所周知多線(xiàn)程在多核系統(tǒng)上有很多的優(yōu)點(diǎn),但是由于多年前我們的處理器只是單核,加上設(shè)計(jì)多線(xiàn)程的軟件產(chǎn)品是更為復(fù)雜。大多數(shù)軟件,包括最新的UEFI BIOS都是單線(xiàn)程的。
4.1 系統(tǒng)設(shè)計(jì)原則
遵循uEFI 規(guī)范,對(duì)其他EFI組件不做修改。要做到更好的模塊化;
獨(dú)立的模塊,以Protocol的形式提供線(xiàn)程服務(wù),這樣才符合uEFI 的宗旨易于擴(kuò)展和升級(jí);
保證以實(shí)現(xiàn)規(guī)定的順序加載EFI驅(qū)動(dòng),并保證驅(qū)動(dòng)程序的完整性;
保證EFI Shell命令,EFI應(yīng)用程序以及OS加載器的完整性;
保證多線(xiàn)程服務(wù)的可靠性,包括線(xiàn)程的創(chuàng)建,取消,終止;
保證多線(xiàn)程服務(wù)變量的一致性,包括全局變量和局部變量;
保證多線(xiàn)程服務(wù)調(diào)度的合理性,包括避免調(diào)度可能出現(xiàn)的死鎖;
采用線(xiàn)程1:1模式來(lái)映射LWP,且保證每一個(gè)CPU內(nèi)核運(yùn)行一個(gè)線(xiàn)程。
4.2 系統(tǒng)設(shè)計(jì)方案
本論文在DXE階段和BDS階段設(shè)計(jì)的多線(xiàn)程服務(wù)庫(kù)主要保障DXE驅(qū)動(dòng)程序加載的正確性和驅(qū)動(dòng)程序安裝服務(wù)的完整性。保證在DXE后期和BDS階段,其他驅(qū)動(dòng)使用的線(xiàn)程服務(wù)的合法無(wú)誤。本論文中設(shè)計(jì)的線(xiàn)程調(diào)度算法,默認(rèn)是EFI_SCHED_FCFS,當(dāng)然這是最基本的算法的實(shí)現(xiàn),另外還有EFI_SCHED_QUEUE,EFI_SCHED_OTHER。
EFI_SCHED_FCFS
FCFS顯然是最簡(jiǎn)單,最容易操作的算法。而一切更為復(fù)雜的算法,也大多都是基于這個(gè)算法做的更深入的修改。
EFI_SCHED_QUEUE
該算法是就是創(chuàng)建多個(gè)隊(duì)列,每個(gè)隊(duì)列里面存放等待線(xiàn)程。它可以提高系統(tǒng)吞吐量,提供叫好的I/O設(shè)備利用率。往往這個(gè)算法也結(jié)合優(yōu)先級(jí)算法一起使用達(dá)到更好的效果。
EFI_SCHED_OTHER
EFI_SCHED_OTHER是本論文中增強(qiáng)的調(diào)度算法,該算法是融合了先到先服務(wù)算法,多級(jí)隊(duì)列調(diào)度算法,優(yōu)先級(jí)算法為一體的綜合算法。所以,默認(rèn)算法有著比較均衡的性能指標(biāo)。能夠取各種算法的優(yōu)點(diǎn),同時(shí)又能避開(kāi)各個(gè)算法的缺點(diǎn)?;旧线_(dá)到了取長(zhǎng)補(bǔ)短的目的。
4.3 多線(xiàn)程的總體架構(gòu)設(shè)計(jì)
本論文的設(shè)計(jì)方案,其多線(xiàn)程服務(wù)庫(kù)是通過(guò)EFI驅(qū)動(dòng)在DXE階段加載后建立的標(biāo)準(zhǔn)的uEFI 協(xié)議實(shí)現(xiàn)。由于標(biāo)準(zhǔn)的EDK[5]并沒(méi)有提供創(chuàng)建這些服務(wù)程序的驅(qū)動(dòng),因此必須首先要開(kāi)發(fā)建立多線(xiàn)程服務(wù)的EFI驅(qū)動(dòng)。
最底層是真正的硬件平臺(tái),也就是物理多核 CPU。它是真實(shí)存在的物理設(shè)備,沒(méi)有被任何軟件抽象。基于 uEFI的協(xié)議,實(shí)現(xiàn)了線(xiàn)程服務(wù)的調(diào)度,創(chuàng)建,取消,同步等工作。
4.4 uEFI 多線(xiàn)程服務(wù)的實(shí)現(xiàn)
多線(xiàn)程服務(wù)是線(xiàn)程庫(kù)的底層實(shí)現(xiàn)。包含線(xiàn)程的狀態(tài)機(jī)設(shè)計(jì),硬件處理器的狀態(tài)機(jī)設(shè)計(jì),以及線(xiàn)程服務(wù)的核心調(diào)度器的設(shè)計(jì),3個(gè)大方面。
4.4.1 線(xiàn)程的狀態(tài)機(jī)
線(xiàn)程在調(diào)度器的協(xié)調(diào)下能夠正常地工作,關(guān)于線(xiàn)程的狀態(tài)切換,這里做一個(gè)比較直觀的說(shuō)明,如圖4所示:
圖4 線(xiàn)程的狀態(tài)機(jī)
從圖4 中可以看出:
線(xiàn)程被創(chuàng)建以后,該線(xiàn)程就成為默認(rèn)狀態(tài);
隨后會(huì)被創(chuàng)建線(xiàn)程的函數(shù)插入到線(xiàn)程等待隊(duì)列中成為線(xiàn)程隊(duì)列等待狀態(tài);
線(xiàn)程如果被調(diào)度,則該線(xiàn)程就會(huì)運(yùn)行起來(lái),成為線(xiàn)程運(yùn)行狀態(tài);
線(xiàn)程如果正在等待,同時(shí)又有取消的請(qǐng)求,那么調(diào)度器就會(huì)取消線(xiàn)程,該線(xiàn)程進(jìn)入到取消狀態(tài);
最后線(xiàn)程處理完畢,或者直接調(diào)用線(xiàn)程服務(wù)中的退出函數(shù)達(dá)到退出狀態(tài)。
4.4.2 處理器的狀態(tài)機(jī)
在線(xiàn)程的啟動(dòng),運(yùn)行,退出的過(guò)程中,線(xiàn)程的服務(wù)會(huì)對(duì)處理器做出不同的操作。有時(shí)候需要等待 CPU,有時(shí)候需要啟動(dòng)CPU,等等,CPU狀態(tài)機(jī)示意圖,如圖5所示:
圖5 處理器的狀態(tài)機(jī)
如圖5所示,處理器一共有4種狀態(tài):
處理器在多處理器服務(wù)的操作下能夠?qū)崿F(xiàn)關(guān)閉,開(kāi)啟的狀態(tài)。
線(xiàn)程服務(wù)則可以利用處理器空閑的狀態(tài)來(lái)調(diào)度線(xiàn)程,并運(yùn)行之。
4.4.3 多線(xiàn)程服務(wù)協(xié)議
多線(xiàn)程服務(wù)協(xié)議提供了一種比較通用的uEFI 協(xié)議來(lái)完成多線(xiàn)程的各種工作,EFI_THREAD_SERVICES_PROTOCOL這個(gè)協(xié)議服務(wù)協(xié)議就是本論文開(kāi)發(fā)的重中之重。在這個(gè)協(xié)議里面提供了所有多線(xiàn)程服務(wù)鎖需要的功能函數(shù)。簡(jiǎn)單描述一樣如下:
ThreadCreate創(chuàng)建一個(gè)線(xiàn)程
ThreadDetach處理等待某個(gè)線(xiàn)程
ThreadJoin同步等待一個(gè)線(xiàn)程
ThreadExit終止一個(gè)線(xiàn)程
ThreadCancel脫離一個(gè)同步好的線(xiàn)程
ThreadSelf獲取自身的線(xiàn)程ID
ThreadMutexLock線(xiàn)程對(duì)變量加鎖
ThreadMutexUnlock線(xiàn)程對(duì)變量解鎖
ThreadMutexTryLock線(xiàn)程嘗試對(duì)變量加鎖
4.4.4 線(xiàn)程調(diào)度器的程序?qū)崿F(xiàn)
本論文的調(diào)度器在默認(rèn)情況下使用EFI_SCHED_FCFS。線(xiàn)程調(diào)度器是多線(xiàn)程服務(wù)的核心,它的訪(fǎng)問(wèn)對(duì)象就是32個(gè)循環(huán)隊(duì)列構(gòu)成的數(shù)組。對(duì)于每一個(gè)特定的隊(duì)列,則每次都去詢(xún)問(wèn)并執(zhí)行。每一個(gè)循環(huán)隊(duì)列在被調(diào)度的過(guò)程中是按照入隊(duì)的先后順序來(lái)調(diào)度的。在優(yōu)先級(jí)調(diào)度的時(shí)候,是按照在創(chuàng)建線(xiàn)程的時(shí)候,默認(rèn)的優(yōu)先級(jí)數(shù)來(lái)調(diào)度的。
在調(diào)度器的內(nèi)部還有一個(gè)計(jì)數(shù)器,確保每次調(diào)度線(xiàn)程都是較高優(yōu)先級(jí)的。并且級(jí)別較低的線(xiàn)程等待時(shí)間超過(guò)規(guī)定時(shí)間,那么調(diào)度器會(huì)自動(dòng)提升低優(yōu)先級(jí)的線(xiàn)程優(yōu)先級(jí)數(shù)。線(xiàn)程調(diào)度器的核心流程圖,如圖6所示:
圖6 調(diào)度器核心流程
4.5 uEFI 多線(xiàn)程程序的應(yīng)用
多線(xiàn)程的優(yōu)勢(shì)在其他的操作系統(tǒng)下面已經(jīng)都得到了論證。那么這個(gè)小節(jié)主要介紹多線(xiàn)程的在uEFI 下的應(yīng)用。
uEFI 的快速啟動(dòng)
最剛性的需求是WIN8對(duì)OS和BIOS的啟動(dòng)時(shí)間做了非常精確的定義。比如在筆記本電腦上,用SSD的情況下,必須要在2秒內(nèi)進(jìn)OS;臺(tái)式機(jī)則是4秒。這對(duì)于傳統(tǒng)的BIOS來(lái)說(shuō)是一項(xiàng)很大的挑戰(zhàn)。顯然,多線(xiàn)程在這個(gè)方面表現(xiàn)是客觀的。不過(guò)目前,BIOS行業(yè)還沒(méi)有采用這一技術(shù)。可以預(yù)見(jiàn)的未來(lái),在BIOS快速啟動(dòng)這一塊,多線(xiàn)程可以做出很多的貢獻(xiàn)。
uEFI 應(yīng)用程序的性能提高
在uEFI 的環(huán)境下,現(xiàn)在已經(jīng)越來(lái)越多的普通的EFI應(yīng)用程序大量出現(xiàn)在研發(fā)部門(mén)和工廠(chǎng)部門(mén)。在市場(chǎng)上也出現(xiàn)了多種多樣的EFI應(yīng)用程序。尤其uEFI 在畫(huà)圖的方面原本就做了很多的提高。在用到Hii的時(shí)候,那么多線(xiàn)程顯得尤為有優(yōu)勢(shì)。純軟件的設(shè)計(jì)和操作,正是多線(xiàn)程的強(qiáng)項(xiàng)。
uEFI 應(yīng)用程序的反應(yīng)速度提高
多線(xiàn)程能夠提高那些數(shù)量計(jì)算較多的反應(yīng)速度。比如現(xiàn)在很多大廠(chǎng)(HP, DELL等等),他們?cè)谥靼宄鲐浿岸紩?huì)做嚴(yán)格的硬件診斷。而這些診斷程序都是在EFI SHELL下運(yùn)行的。其中不乏有大量數(shù)據(jù)處理的EFI應(yīng)用程序。那么,這個(gè)時(shí)候,多線(xiàn)程服務(wù)就派上用場(chǎng)了。
本文通過(guò)研究uEFI BIOS的架構(gòu)和實(shí)現(xiàn)原理,具體實(shí)現(xiàn)了uEFI 環(huán)境下的多線(xiàn)程服務(wù),豐富并增強(qiáng)了uEFI 這個(gè)可擴(kuò)展接口的標(biāo)準(zhǔn)。該多線(xiàn)程服務(wù),可以提高應(yīng)用程序的性能,可以提高加快BIOS的啟動(dòng)速度,可以提高應(yīng)用程序的反應(yīng)速度等。因此,該多線(xiàn)程服務(wù)技術(shù)有很高的使用價(jià)值。
[1] 陳文欽.BIOS研發(fā)技術(shù)剖析[M].北京:清華大學(xué)出版社,2001.9.
[2] Intel Inc..Extensible Firmware Interface Specification[J]. Intel Inc.,2002,12
[3] Intel Inc..Intel?Itanium?Processor Family System Abstraction Layer Specification Version 3.4[J].Intel Inc.,2009,5
[4] Lubomir F.Bic,Alan C.Shaw.Operating System Principles[M],北京:清華大學(xué)出版社,2004.
[5] Intel Inc..EDK Getting Started Guide[J],2005, 6
Research and Design Of BIOS’s Multi-Thread Operating Mechanism Based on UEFI Standard
Zhang Yuanhu1, Xiang Mingqiong2, Wu You2, Yang Yong3
(1. Shanghai Jiaotong University, Shanghai 201201, China; 2. Shanghai Enty-Exit Inspection and Quarantine Bureau, Shanghai 201201, China; 3. Shanghai Institute of Satellite Engineering, Shanghai 201201, China)
This paper analyzes the BIOS’s running environment, framework and its executive process based on UEFI. Based on the Pthread theory under the OS, it proposes the the design concept and scheme of multi-thread under UEFI BIOS environment. After following UEFI specification restrictly it realizes and verifies multi-thread scheme based on UEFI, and finishes the research of multithreadingservice in the start-up procedure. It is veried in the practical application that it is convenient and is of strong practicability.
UEFI; BIOS; Multi-Threa
V474
A
2014.10.11)
1007-757X(2014)12-0035-03
張遠(yuǎn)虎(1985-),男,漢族,刺穿瀘縣,晟碟信息科技有限公司,碩士,研究方向:BIOS系統(tǒng)設(shè)計(jì)與研究,上海,201201
相明瓊(1987-),男,漢族,山東聊城,上海出入境檢驗(yàn)檢疫局,工程師,碩士,研究方向:信息化管理、UEFI研究,上海,201201
吳 猷(1982-),男,漢族,浙江寧波,上海出入境檢驗(yàn)檢疫局,助理工程師,研究方向:信息化管理、UEFI研究,上海,201201
楊 勇(1980-),男,漢族,山西運(yùn)城,上海衛(wèi)星工程研究所,高級(jí)工程師,碩士,研究方向:電子系統(tǒng)研發(fā)、射頻通信,上海,201201