一種基于龍芯手持式計算機的uefi固件實現方法
【技術領域】
[0001]本發(fā)明屬于計算機固件技術領域,涉及一種基于龍芯嵌入式處理器的手持式計算機系統(tǒng)(以下簡稱龍芯手持機)的UEFI固件實現方法。
【背景技術】
[0002]UEFI (Unified Extensible Firmware Interface,統(tǒng)一的可擴展固件接口)是一種計算機固件(或稱為B1S)的接口規(guī)范,也是關于固件的最主要的工業(yè)標準。UEFI規(guī)范最初是面向Intel公司的Itanium和X86處理器進行制定的,但是UEFI規(guī)范本身是與處理器架構無關的,目前已經應用于X86、Itanium、ARM等處理器平臺。符合UEFI規(guī)范的計算機固件(以下簡稱UEFI固件)相對于傳統(tǒng)的固件有很多優(yōu)越性,目前主流的X86商用計算機系統(tǒng)基本上都是采用了 UEFI固件。
[0003]龍芯(Loongson)是由中國科學院計算所研制的國產通用中央處理器,采用MIPS精簡指令集架構。龍芯處理器已形成一系列產品,分別可應用于嵌入式、臺式、便攜式計算機以及服務器產品。其中應用于嵌入式領域的龍芯處理器(以下簡稱龍芯嵌入式處理器)是一個SOC芯片,不僅包含處理器核心,還集成了多個外設控制器。目前主要的龍芯嵌入式處理器是龍芯1A。
[0004]PMON是一款開源固件,最初是為LSI Logic MIPS R3000評估板而設計,后來成為MIPS領域評估板和開發(fā)系統(tǒng)的通用固件。官方的PMON固件已經停止維護與發(fā)展,最新的PM0N2000是PMON的非官方后繼版本。龍芯廠商采用PM0N2000作為調試處理器的固件,并應用在龍芯手持機解決方案中。但PMON與常規(guī)的UEFI計算機固件相比存在很多不足,主要表現在:ΡΜ0Ν項目在很多年前就已經停止更新,在計算機工業(yè)界很少有廠家使用PMON或對其進行支持,因此PMON無法進行規(guī)范化和得到發(fā)展;不像UEFI固件支持最新的計算機技術,PMON代碼對很多技術規(guī)范都不支持,無法實現對一些常見功能的支持,比如ACPI (目前最為通用的電源管理技術)、GRUB(目前最為通用的操作系統(tǒng)內核加載器)等;與服?1固件相比,PMON沒有采用模塊化方法進行設計實現,可擴展性不強,開發(fā)維護也不方便。
【發(fā)明內容】
[0005]本發(fā)明的目的主要是為了解決上述現有技術的缺陷,提供一種基于龍芯手持式計算機的UEFI固件的實現方法。根據這個方法,可以在龍芯手持機上實現出符合國際主流UEFI固件規(guī)范、可擴展性強、功能完善的固件產品,以支持龍芯手持機的正常啟動和運行。
[0006]一種基于龍芯手持機的UEFI固件的實現方法,UEFI固件劃分為硬件抽象層、固件核心層、設備協(xié)議層和固件應用層。
[0007]其中,硬件抽象層實現處理器、內存、外設控制器等關鍵硬件部件的初始化,對其他板級硬件進行包裝和抽象并實現初始化,同時為上層模塊提供訪問底層硬件設備的函數接口。其包括處理器驅動模塊和外設驅動模塊,處理器驅動模塊完成龍芯嵌入式處理器核心和內存的初始化,并提供訪問處理器、內存的接口 ;外設驅動模塊實現龍芯嵌入式處理器中集成的外設控制器的初始化,還要完成主板上各種外設的驅動,如LCD顯示屏、NANDFLASH存儲器、T9鍵盤、USB設備等,每個外設會對應一個(或多個)驅動模塊。
[0008]固件核心層類似于操作系統(tǒng)的內核,建立UEFI中的系統(tǒng)服務表,進行固件中所有模塊的統(tǒng)一管理和各種資源的管理。其包括固件核心加載模塊、固件核心模塊和基礎架構功能模塊,固件核心加載模塊負責加載固件核心模塊,并為其準備運行環(huán)境,固件核心模塊負責建立UEFI規(guī)范中的啟動服務(Boot Service)和運行時服務(Runtime Service)表,加載、運行其他功能模塊,管理各模塊之間的交互,實現內存的管理,實現和維護時鐘中斷和事件機制,實現和維護固件應用的特權級機制,實現UEFI規(guī)范中定義的Protocol的管理機制,實現UEFI規(guī)范要求實現的其他機制和功能,如調試接口、壓縮算法、變量存儲/處理等?;A架構功能模塊實現UEFI規(guī)范中的Architectural Protocol,包括多個功能模塊,每個模塊實現一個 Architectural Protocol。每個 Architectural Protocol 包含一些基礎服務接口,供固件中的其他功能模塊調用。
[0009]設備協(xié)議層實現各種標準的工業(yè)規(guī)范,包括總線協(xié)議、外設接口等。其包括總線協(xié)議模塊,實現了各種總線協(xié)議,如PCI/PCIE、PS/2、USB、SMBUS、LPCBUS等。通常是一個模塊實現一種總線協(xié)議,并通過UEFI規(guī)范中的Protocol機制“發(fā)布”這些總線的接口,這樣其他模塊就可以使用這些接口來訪問總線。
[0010]固件應用層實現固件的各項功能,如人機界面、操作系統(tǒng)引導等。其包括設備掃描模塊、人機界面模塊和系統(tǒng)支持模塊,設備掃描模塊枚舉系統(tǒng)中的外設,為這些設備分配資源,并將設備與相應的外設驅動模塊進行Connect (也即交給該設備驅動進行管理);人機界面在LCD顯示屏上顯示一個菜單界面,提供幾個用戶可選擇的操作;系統(tǒng)支持模塊實現操作系統(tǒng)的啟動、恢復、升級等功能,操作系統(tǒng)的啟動就是從NAND FLASH或者U盤中將內核文件加載到內存執(zhí)行,操作系統(tǒng)的恢復是利用存儲在NAND FLASH備份區(qū)或者U盤中的內核文件覆蓋NAND FLASH中損壞的內核數據,操作系統(tǒng)的升級則是讀取U盤中的內核文件來更新NAND FLASH中舊的內核數據。
[0011]本發(fā)明的基于龍芯手持機的UEFI固件的具體運行步驟如下:
[0012](I)初始化處理器、內存,建立起固件運行的基本環(huán)境;
[0013](2)將UEFI固件代碼復制到內存,并對固件進行解壓,加載固件核心模塊;
[0014](3)建立UEFI固件的基礎服務;
[0015](4)加載UEFI固件功能模塊,包括基礎架構功能模塊、設備協(xié)議模塊;
[0016](5)掃描設備并為設備分配系統(tǒng)資源,加載設備驅動模塊,完成設備初始化;
[0017](6)運行人機界面;
[0018](7)啟動操作系統(tǒng),或進行操作系統(tǒng)的恢復、升級操作。
[0019]上述步驟中,步驟(I)中執(zhí)行處理器驅動模塊。處理器驅動模塊采用MIPS匯編語言實現,是系統(tǒng)上電后首先執(zhí)行的模塊,此時內存還未完成初始化,所以這個模塊直接在FLASH芯片中運行。處理器驅動模塊實現龍芯IA處理器、Cache (高速緩存)、內存、TLB (旁路轉換緩沖)等初始化,實現MCU (內存控制器)、SMBUS和內存的初始化,配置內存地址窗口,并提供訪問CPU、Cache、內存等部件的接口。處理器驅動模塊還要初始化處理器中的串口模塊,為后續(xù)的固件代碼的提供調試手段。
[0020]上述步驟中,步驟⑵中執(zhí)行固件核心加載模塊。步驟⑴執(zhí)行完成后,系統(tǒng)內存已經初始化好,此時固件代碼可以在內存中運行以加快運行速度;而且可以用C語言來實現固件代碼,加快開發(fā)速度。固件中包含的功能模塊較多,而FLASH芯片的容量有限,一般需要將存放功能模塊的固件卷進行壓縮,固件核心加載模塊負責從FLASH中將壓縮的固件卷復制到內存中,并進行解壓;解壓成功后,在內存中創(chuàng)建HOB(Hand-Off Block)數據表,存放處理器、內存、FLASH等系統(tǒng)信息,提供給后續(xù)的固件模塊使用;最后,固件核心加載模塊將控制權交給固件核心模塊。
[0021]上述步驟中,步驟(3)中執(zhí)行固件核心模塊。固件核心模塊首先初始化UEFI的系統(tǒng)服務,為后續(xù)的功能模塊的加載、運行做準備。主要是完成UEFI系統(tǒng)表、UEFI啟動服務表和UEFI運行時服務表的初始化,具體服務包括代碼調試、內存管理、UEFI鏡像管理、Η0Β、UEFI時鐘、FLASH訪問、解壓縮、固件卷解析、UEFI事件、任務優(yōu)先級、UEFI Protocol管理、UEFI變量存取等。系統(tǒng)服務表存放在內存的特定區(qū)域,UEFI固件中的所有功能模塊都可以調用這些系統(tǒng)服務。
[0022]上述步驟中,步驟(4)中固件核心模塊加載固件的功能模塊。固件核心模塊通過檢索固件卷,依次查找其中的功能模塊,并將其加載到內存中。每個功能模塊都被編譯成一個PE/ELF格式的可執(zhí)行鏡像,固件核心模塊需要解析功能模塊鏡像,然后加載到內存的特定地址處,并跳轉到入口函數。功能模塊的入口函數執(zhí)行完成后,通常會返回到固件核心模塊,固件核心模塊繼續(xù)進行下一個功能模塊的加載。
[0023]在步驟(4)中被加載的模塊包括基礎架構功能模塊、設備協(xié)議模塊。其中,基礎架構功能模塊主要功能是實現UEFI規(guī)范中的Architectural Protocol,主要包括:Boot Device Select1n (BDS)、CPU、Metronome、Monotonic Counter、Real Time Clock、Runtime、Security、Status Code、Timer、Variable、Variable Write、Watchdog Timer,每個Architectural Protocol由一個模塊來實現;設備協(xié)議層模塊主要實現訪問PCI/PCIE、USB、SMBUS、LPCBUS等總線的函數接口,并封裝在Protocol中供其他功能模塊調用,通常是一個模塊實現一種總線協(xié)議。
[0024]上述步驟中,步驟(5)中完成設備的初始工作。固件核心模塊加載設備驅動模塊,實現龍芯嵌入式處理器中集成的外設控制器的初始化,包括顯示控制器、PS2控制器、USB控制器、NAND FLASH控制器、LPC控制器;并實現主板上外設的初始化和實現訪問外設的函數接口,包括IXD顯示屏、NAND FLASH存儲器、T9鍵盤、USB設備等。通常由一個模塊實現一種設備驅動。另外,在這個階段由設備掃描模塊掃描系統(tǒng)中的所有外設,并為外設分配內存、10和中斷資源,這樣外設在操作系統(tǒng)下才能正常工作。
[0025]上述步驟中,步驟¢)中固件核心模塊加載固件卷中的固件應用模塊,主要包括人機界面模塊、系統(tǒng)支持模塊。然后運行人機界面模塊,在LCD顯示屏上提供少量的幾個菜單,用戶可通過T9鍵盤來選擇要進行的操作,包括查看固件版本信息、進行系統(tǒng)恢復、系統(tǒng)升級、系統(tǒng)啟動等;如果用戶沒有進行按鍵操作,則固件在等待時間超時后,自動進行操作系統(tǒng)啟動。
[0026]上述步驟中,步驟(7)中系統(tǒng)支持模塊實現操作系統(tǒng)的啟動、恢復和升級功能。根據用戶在上一步驟中的選擇,固件進行操作系統(tǒng)的恢復、升級或者啟動功能。在進行操作系統(tǒng)恢復或升級時,固件從NAND FLASH中的備份區(qū)域或者U盤中讀取操作系統(tǒng)內核文件,并寫入NAND FLASH中存放操作系統(tǒng)內核的區(qū)域;在進行操作系統(tǒng)啟動時,固件從NAND FLASH中將操作系統(tǒng)內核文件瀆取到內存,并為內核準備必要的啟動參數,然后將控制權交給內核并的區(qū)域的備份區(qū),從而完成系統(tǒng)的