朱勇洪
摘要:由于UEFI框架下沒有提供數(shù)據(jù)傳輸?shù)哪K,使得測試或者調(diào)試開發(fā)時(shí)需要經(jīng)常對數(shù)據(jù)文件進(jìn)行人工拷貝,導(dǎo)致了實(shí)現(xiàn)測試自動(dòng)化或遠(yuǎn)程調(diào)試的不便。采用Socket數(shù)據(jù)傳輸方式設(shè)計(jì)并實(shí)現(xiàn)了UEFI下數(shù)據(jù)傳輸?shù)墓ぞ?,通過使用串口線來連接Host端和UEFI端,實(shí)現(xiàn)UEFI下的Application和Hostt端協(xié)同工作來達(dá)到Host端和uEFI端通信的目的,從而使得從Host端編譯出來的文件可以直接傳輸?shù)経EFI端的設(shè)備中去,減少人工操作方便實(shí)現(xiàn)測試自動(dòng)化。最后本文通過Intel 945G Express Chioset平臺(tái)來驗(yàn)證工具的正確性。
關(guān)鍵詞:UEFI;數(shù)據(jù)傳輸;Application;串口;Socket
中圖分類號(hào):TP311.56 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1006-8228(2020)07-26-04
0引言
數(shù)據(jù)傳輸,顧名思義,就是要將數(shù)據(jù)從一個(gè)地方傳送到另一個(gè)地方的通信過程。目前,UEFI框架下并沒有提供數(shù)據(jù)傳輸?shù)墓ぞ撸瑢?dǎo)致開發(fā)人員、測試人員將UEFIBIOS文件編譯出來之后,需要手動(dòng)拷貝該文件到UEFI主板設(shè)備中,大量的人工操作導(dǎo)致了實(shí)現(xiàn)自動(dòng)化測試或者遠(yuǎn)程調(diào)試的不便?;谶@樣的實(shí)用背景,本文通過采用Socket的數(shù)據(jù)傳輸方式,實(shí)現(xiàn)UEFI端的Application協(xié)同Host端進(jìn)行工作,達(dá)到Host端和UEFI端之間的通信的功能,從而可以輕松的將文件在兩端互傳,避免了手動(dòng)操作,為遠(yuǎn)程調(diào)試和測試自動(dòng)化提供基礎(chǔ)。
1UEFl Application簡介
UEFI的Application指系統(tǒng)的核心應(yīng)用和調(diào)用程序,如BIOS的設(shè)置、一些應(yīng)用程式以及配置管理等等,它與UEFI庫函數(shù)結(jié)合在一起,可以提供基本控制臺(tái)I/O,基本磁盤I/O,內(nèi)存管理以及字符串操作的功能。它是不依賴于系統(tǒng)軟硬件的跨平臺(tái)擴(kuò)展Firmware,以.eft文件形式存在,它在執(zhí)行完成后會(huì)返回控制權(quán),不會(huì)駐留在系統(tǒng)內(nèi)存中,因而能夠方便地移植到各個(gè)不同的平臺(tái)上(例如,IA32、IA64、Intel-64、Apple*,Duet模擬器等等)。UEFI Application的編程模型主要分為兩大類,一類是基于EFI模型的,它的代碼比較小,因?yàn)樗鼉H僅需要使用EFI的數(shù)據(jù)結(jié)構(gòu);另一類是基于便攜式模型開發(fā)的,與前一類相比較,它是一種更容易導(dǎo)入ANSI/POSIX編程模型的程序,并且它擁有常用的c語言的Library和c語言編程接口程序。
UEFI Application的執(zhí)行流程分為三個(gè)部分,首先它必須經(jīng)過UEFI Loader來進(jìn)行加載,然后進(jìn)入到Application的入口函數(shù)處,最后通過Exit()退出應(yīng)用并返回Application的UEFI Component。
2基于UEFl的數(shù)據(jù)傳輸工具的研發(fā)
數(shù)據(jù)傳輸?shù)姆绞揭话阌幸韵聨追N:最簡單交互的socket方式,適合大數(shù)據(jù)量交互的邱/文件共享服務(wù)器方式,數(shù)據(jù)庫共享數(shù)據(jù)方式以及Message數(shù)據(jù)傳輸方式。本文采用socket方式,因?yàn)樵摲绞酵ㄓ眯员容^強(qiáng),且易于編程實(shí)現(xiàn),通過傳輸層協(xié)議容易加密傳輸?shù)臄?shù)據(jù),使得安全性更高,同時(shí)UEFI下需要傳輸?shù)奈募亢苄?,?shù)據(jù)交互量少,也比較適用該方式。
2.1設(shè)計(jì)架構(gòu)分析
通過使用串口線纜來連接Host端和UEFI端,Host端使用Windows 10 Enterprise系統(tǒng),通過標(biāo)準(zhǔn)的c++語言開發(fā)程序,UEFI端使用支持UEFI啟動(dòng)的主板,使用c語言編寫并通過編譯產(chǎn)生一個(gè)備數(shù)據(jù)傳輸功能的UEFI Application的應(yīng)用程序,此處所使用的c語言在庫函數(shù)、框架結(jié)構(gòu)、調(diào)用的服務(wù)類型等方面需參照Platform Initialization Spec。
Host端主要由以下四個(gè)部分組成:基本信息部分、串口控制部分、線程控制部分、文件傳輸部分。
(1)基本信息部分:通過運(yùn)行ReadSetuplnfo()函數(shù)來讀取串口的相關(guān)配置信息,主要包括串口的名稱、波特率和串口的流控信息,并將這些信息存入到指定的數(shù)據(jù)結(jié)構(gòu)中。
(2)串口控制部分:創(chuàng)建一個(gè)CSerial類來負(fù)責(zé)串口的初始化并獲得句柄進(jìn)行串口的讀寫操作。在該類中封裝了初始化串口和控制串口運(yùn)行過程中需要使用的一些變量以及讀寫串口時(shí)需要的相關(guān)函數(shù)。
(3)線程控制部分:設(shè)計(jì)主線程、讀線程和寫線程。主線程主要負(fù)責(zé)創(chuàng)建讀寫線程,后續(xù)將不再進(jìn)行其他操作,可留作后續(xù)開發(fā)的拓展使用。在使用串口進(jìn)行數(shù)據(jù)的讀寫傳輸時(shí),讀線程負(fù)責(zé)讀取UEFI端通過串口線纜發(fā)送過來的信息,并將這些信息顯示在屏幕上;寫線程則負(fù)責(zé)將用戶輸入的信息(例如,需要傳輸?shù)奈募┩ㄟ^串口線纜發(fā)送到UEFI端。
(4)文件傳輸部分:包括從Host端發(fā)送單個(gè)文件到UEFI端和從UEFI端接收單個(gè)文件兩部分,這個(gè)過程需要UEFI端的Application配合使用。
UEFI端是一個(gè)基于UEFI的Application應(yīng)用程序,參考EDKIIINFSpec、DSCSpec、DECspec提供該程序所需要的模塊文件(.inf)及c文件,平臺(tái)描述文件(.dsc)和平臺(tái)聲明文件(.dec),其功能是為了配合Host端的文件傳輸部分,其中UEFI端主要實(shí)現(xiàn)了從Host端接收單個(gè)文件和發(fā)送單個(gè)文件到Host端這兩個(gè)部分的功能。
2.2數(shù)據(jù)傳輸實(shí)現(xiàn)過程分析
對于數(shù)據(jù)的傳輸,其實(shí)現(xiàn)過程主要包括四個(gè)部分:Host端發(fā)送單個(gè)文件,Host端接收單個(gè)文件,UEFI端發(fā)送單個(gè)文件以及UEFI端接收單個(gè)文件。以Host端發(fā)送單個(gè)文件為例,其過程主要包括①讀取用戶輸入的文件名,并將文件打開;②將讀取到的文件名轉(zhuǎn)換成傳輸至UEFI端的路徑、文件名組合;③計(jì)算該文件名的長度以及文件的長度;④調(diào)用TestSpeed H to_T()函數(shù)來測試Host端向UEFI端傳輸數(shù)據(jù)的速度;⑤按照上一步獲得的數(shù)據(jù)來設(shè)置傳輸包的長度以及包的傳輸時(shí)間間隔;⑥按照包封裝的形式發(fā)送包含文件名、文件名長度、文件長度的數(shù)據(jù)包至UEFI端;⑦按照包封裝的形式發(fā)送文件內(nèi)容至UEFI端;⑧釋放所使用的相關(guān)資源,從Host端到UEFI端的數(shù)據(jù)傳輸?shù)酱私Y(jié)束。在該過程中,主函數(shù)TransferHostFile()首先調(diào)用SafeSendData()函數(shù)來發(fā)送包含文件名、文件名長度、文件長度的數(shù)據(jù)包至UEFI端,然后再次調(diào)用SafeSendData()函數(shù)來發(fā)送文件內(nèi)容至UEFI端。而SafeSendData()函數(shù)則會(huì)將所得到的所有數(shù)據(jù)分裝成數(shù)據(jù)包的形式,然后將數(shù)據(jù)包進(jìn)行Md5 CheckSum的計(jì)算來檢驗(yàn)在傳輸過程中數(shù)據(jù)包的正確性。圖1顯示了Host端傳輸文件至UEFI端的流程。
在UEFI端的Application其實(shí)現(xiàn)過程需要將其代碼添加到UEFI的源代碼結(jié)構(gòu)中進(jìn)行編譯,首先需要建立一個(gè)存放該Application源代碼的子目錄和一個(gè)與Application源代碼相關(guān)的.inf文件,對于Application的源文件,可以放在工作目錄的任何地方,而該文件的存放路徑則需要在所開發(fā)模塊的.inf文件中指出。一個(gè)模塊的.inf文件主要是為了定義單個(gè)項(xiàng)目所需要的所有信息,包括了一些源文件,庫或者庫類,以及一些編譯相關(guān)的組件等,用它來產(chǎn)生的二進(jìn)制文件要么是原始的二進(jìn)制文件,要么是具有PE32/PE32+/COFF格式的可以在UEFIShell環(huán)境下執(zhí)行的文件。
3數(shù)據(jù)傳輸工具的測試檢驗(yàn)
該檢驗(yàn)過程分別以Windows 10 Enterprise系統(tǒng)和Intel 945G Express Chipset平臺(tái)作為實(shí)驗(yàn)檢測的Host端和UEFI端,通過串口連接兩端,同時(shí)在UEFI端配備有外圍設(shè)備u盤。將Intel 945G Express Chipset平臺(tái)啟動(dòng)到UEFI Shell的模式下,運(yùn)行處于Host端的程序,在彈出的運(yùn)行窗口中運(yùn)行處于UEFI端u盤中的UEFI Application-FDTTargetWithShell.efi,此時(shí)便可以進(jìn)行Host端和UEFI端的相互通信功能,進(jìn)行單個(gè)文件的收發(fā)功能。
在Host端執(zhí)行數(shù)據(jù)傳輸工具,首先會(huì)獲得串口相關(guān)信息,然后進(jìn))kUEFI端的Shell環(huán)境,由此可進(jìn)入處于UEFI端的外圍設(shè)備u盤中,在運(yùn)行了u盤中的FDTTargetWithShell.eft這個(gè)Application之后便可以在Host端和UEFI端進(jìn)行數(shù)據(jù)傳輸了。此時(shí)狀態(tài)如圖3。
數(shù)據(jù)傳輸工具提供了單個(gè)文件的收發(fā)功能,可以通過輸入操作數(shù)1、2分別進(jìn)行選擇。圖4給出了選擇單個(gè)文件從Host端發(fā)送到UEFI端的過程,圖5給出了文件成功傳輸時(shí)的狀態(tài)。最后通過檢查u盤中的文件來確認(rèn)文件已經(jīng)從Host端傳輸?shù)経EFI端,同時(shí)對接收到的文件與Host端的發(fā)送的文件進(jìn)行比較,來確認(rèn)數(shù)據(jù)在傳輸過程中的完整性。
在選擇輸入操作功能2的情況下,實(shí)現(xiàn)了從UEFI端發(fā)送單個(gè)文件到Host端的功能。圖6給出了選擇單個(gè)文件從UEFI端發(fā)送到Host端的過程,而圖7則給出了雙端通信過程中文件傳輸成功時(shí)的狀態(tài)。
4結(jié)束語
本文采用Socket數(shù)據(jù)傳輸?shù)姆绞皆O(shè)計(jì)了UEFI下的數(shù)據(jù)傳輸工具進(jìn)行UEFI端和Host端的單個(gè)文件的傳輸功能,可以方便開發(fā)人員進(jìn)行遠(yuǎn)程調(diào)試的工作,也可以方便測試人員使用該工具實(shí)現(xiàn)測試自動(dòng)化。下一步可以嘗試對數(shù)據(jù)傳輸?shù)膱D形化界面的設(shè)計(jì)與實(shí)現(xiàn),嘗試支持豐富的窗口創(chuàng)建、控件的支持和顯示顏色特效的添加。目前圖形化界面僅僅負(fù)責(zé)對配置選項(xiàng)進(jìn)行簡單的控制,當(dāng)然選用的圖形化界面語言范圍可以再進(jìn)一步擴(kuò)展,不僅僅局限于UEFI BIOS系統(tǒng)當(dāng)前支持的VFR語言。