何超勇錢曉捷
(鄭州大學信息工程學院,河南鄭州450001)
基于龍芯2F的U-Boot固件移植與顯卡優(yōu)化
何超勇錢曉捷
(鄭州大學信息工程學院,河南鄭州450001)
為提高基于龍芯2F的Yeeloong 8089平臺的擴展性,闡述了U-Boot固件的基本架構和在該平臺上的移植過程。描述了PCI設備特別是顯卡的初始化過程,通過在U-Boot中引入視頻圖形陣列(VGA)基本輸入輸出系統(tǒng)(BIOS)模擬器的方式解決了在非x86架構平臺上使用通用顯卡的問題。經(jīng)過調(diào)試和驗證,U-Boot穩(wěn)定運行于Yeeloong 8089平臺,能夠通過顯卡顯示啟動信息,并可以成功引導Debian Linux內(nèi)核。
龍芯2F U-Boot 模擬器 顯卡 移植
龍芯2F是一款由中科院計算所于2007年研制的高性能低功耗64位通用處理器。該處理器完整實現(xiàn)了MIPS III指令集,采用CMOS 90nm工藝制造,主頻為1GHz并且支持軟件動態(tài)調(diào)節(jié)處理器頻率。因為主要面向桌面應用,所以在芯片內(nèi)集成了DDR2內(nèi)存控制器、PCI/PCI-X總線控制器、Local-Bus接口、中斷控制器以及視頻加速單元。
在嵌入式系統(tǒng)中,固件兼具PC機BIOS和bootloader(如GRUB、LILO)的功能,主要負責開機時對系統(tǒng)的硬件進行初始化和測試,并根據(jù)測試結果來引導操作系統(tǒng)內(nèi)核或者將出錯信息反饋給用戶。由于該過程和具體硬件密切相關,固件一般都依賴于CPU的體系結構和板級硬件配置,基本沒有通用性,至少需要移植和優(yōu)化改進。
逸瓏(Yeeloong)8089是由江蘇中科夢蘭電子科技有限公司推出的一款采用龍芯2F處理器和嵌入式系統(tǒng)架構的創(chuàng)新型筆記本電腦產(chǎn)品,摒棄了在x86體系計算機上沿襲多年的BIOS,轉(zhuǎn)而使用固件來直接加載和引導操作系統(tǒng)內(nèi)核。本文總結了基于該平臺U-Boot固件移植過程中的關鍵問題,并針對非x86架構平臺下通用顯卡的優(yōu)化實現(xiàn)進行了詳述。
U-Boot是由德國的DENX小組所開發(fā)的一款應用廣泛的嵌入式系統(tǒng)固件開源軟件,支持ARM、AVR32、Blackfin、MicroBlaze、MIPS、Nios、PowerPC、x86等數(shù)量眾多的處理器架構平臺。U-Boot遵循GPL軟件協(xié)議,向所有用戶開放源代碼,具有清晰簡潔的代碼樹結構,并且文檔資料和社區(qū)支持非常豐富。Yeeloong 8089平臺目前所使用的固件系統(tǒng)為PMON 2000,該固件雖然能夠滿足基本的功能應用,但是其軟件本身代碼結構雜亂無序、移植困難,社區(qū)趨于癱瘓,用戶數(shù)量匱乏,對后續(xù)的開發(fā)和功能擴展十分不利。因此,移植U-Boot到Yeeloong 8089平臺,不僅能夠豐富平臺的應用,還能夠有效提升該平臺在開發(fā)者群體中的影響力。
2.1 U-Boot目錄結構
U-Boot的主要功能包括硬件系統(tǒng)的檢測和初始化、U-Boot命令行狀態(tài)下各命令的穩(wěn)定運行以及操作系統(tǒng)的正常引導。U-Boot采取了與Linux相類似的模塊劃分方式,同時考慮到了跨平臺移植的問題。如表1所示,在U-Boot源代碼主目錄下,所有的源代碼文件和配置文件都根據(jù)其性質(zhì)和作用被組織于不同的子目錄中。U-Boot的16個一級子目錄,總體可以劃分為3個類型:
①平臺相關:主要是硬件和體系結構相關;②通用:主要是通用函數(shù)和驅(qū)動程序
③支持:主要是各種應用程序、工具和文檔
表1 U-Boot一級子目錄功能和類型
U-Boot的移植過程中所需要考慮的基本都是平臺相關類型的子目錄。U-Boot支持多種體系結構和上百種類型的開發(fā)板,對于特定的體系結構和開發(fā)板,移植過程主要是通過配置文件來選定相應的代碼,同時依據(jù)實際需要來進行裁剪、添加和優(yōu)化。
2.2 基于Yeeloong 8089平臺的U-Boot移植
龍芯2F在啟動時需要根據(jù)BEV寄存器的值來判斷入口地址。當系統(tǒng)為冷啟動時,BEV的值為1,入口地址為0xbfc00000;當系統(tǒng)為熱啟動時,BEV的值為0,入口地址為0x80000000。當目標主板上電冷啟動時,龍芯2F將從0xbfc00000地址處取指令開始運行,而該地址從硬件上被映射到系統(tǒng)固件Flash芯片的第一條指令,也就是U-Boot的第一條指令。
U-Boot的啟動分為stage1和stage2兩個階段:
(1)Stage1階段
與體系結構、硬件配置密切相關。該部分代碼主要用匯編語言實現(xiàn),目的在于提高程序的執(zhí)行效率。主要實現(xiàn)CPU、RAM、Nand Flash、Cache的初始化,建立臨時堆棧,將U-boot加載到RAM,以及建立內(nèi)存重定位和映射,為Stage2準備運行環(huán)境。
(2)Stage2階段
主要實現(xiàn)通用的功能,如相關協(xié)議、Shell命令等。該部分代碼用C語言實現(xiàn),目的在于提高程序的可讀性和移植性。主要實現(xiàn)初始化其余硬件,將內(nèi)核加載到RAM,檢測系統(tǒng)內(nèi)存映射,設置啟動參數(shù),為內(nèi)核準備運行環(huán)境。
U-Boot移植過程中主要使用ELDK(The Embedded Linux Development Kit)編譯工具,該工具是由U-Boot項目主要維護人Wolfgang Denk所在的德國DENX軟件工程公司所推出的嵌入式Linux開發(fā)套件,其中包含了GNU交叉編譯開發(fā)工具、一些已經(jīng)編譯好的目標工具和提供在目標平臺上進行函數(shù)調(diào)用的庫文件。
基于Yeeloong 8089平臺,U-Boot的移植的主要步驟:
①在源代碼根目錄的Makefile文件中,添加目標平臺的配置信息;
②在board目錄下,創(chuàng)建目標平臺主板目錄,并添加相應的板級初始化代碼和配置文件;
③在include/configs目錄下,創(chuàng)建包含目標平臺主板設置參數(shù)的頭文件;
④在arch/mips目錄下,創(chuàng)建龍芯2F目錄,并添加相應的片級初始化代碼和配置文件;
⑤對代碼進行配置和編譯;
⑥調(diào)試并解決存在的問題。
在上述移植過程中,主要包括了片級移植和板級移植。其中片級移植和龍芯2F芯片相關,主要涉及Start.S和board.c這2個文件,其中的代碼用于完成龍芯2F通用寄存器的初始化、CPO協(xié)處理器的初始化、Watchdog的初始化、Cache的初始化。板級移植和目標主板相關,涉及board子目錄、common子目錄、net子目錄、driver子目錄等多個文件,其中的代碼主要是初始化相關硬件并為之提供驅(qū)動程序。
在YeeLoong 8089目標平臺主板上,龍芯2F處理器通過PCI總線來對AMD CS5536南橋芯片、Sillion SM712顯卡、RTL8139D網(wǎng)卡以及攝像頭等主要外部設備進行連接和控制。移植后的U-Boot可以穩(wěn)定運行于該目標平臺主板上,但是還需要進行一些優(yōu)化工作,主要是解決在龍芯2F這樣的非x86架構平臺上使用通用顯卡的問題。
3.1 顯卡初始化原理
在系統(tǒng)上電之后,固件需要通過掃描PCI總線來確定系統(tǒng)擁有的PCI設備,因此每一個PCI設備都需要實現(xiàn)一個PCI配置空間。PCI設備的配置空間大小為256字節(jié),由多個寄存器組成,分為預定義部分和設備獨立部分,典型PCI設備的配置空間如圖1所示。
圖1 PCI設備配置空間圖
除了用于設備鑒別的Vendor ID、Device ID、Revision ID、Header Type和Class Code這5個寄存器是每個PCI設備都需要實現(xiàn)的以外,圖1所示的其他寄存器都是由生產(chǎn)廠家根據(jù)PCI設備的類型和功能來決定是否實現(xiàn)。
在固件啟動操作系統(tǒng)之前,必須建立一個統(tǒng)一的系統(tǒng)地址空間。固件通過掃描PCI總線,讀取PCI設備的配置空間,PCI設備的寄存器(除了PCI配置寄存器)和內(nèi)存(RAM和ROM)就可以通過一組特殊的寄存器,即圖1所示10h--24h地址處的BAR(Base Address Register)來映射到CPU Memory空間或者CPU I/O空間中的特定地址,這樣就可以避免不同PCI設備之間發(fā)生地址沖突。這個過程就被稱為PCI設備的初始化過程,只有經(jīng)過初始化的PCI設備才可以被正確訪問和使用。
但是由于一些PCI設備(例如顯卡)的復雜性較高,在該過程之后還需要設備專有的PCI Expansion ROM代碼,來進一步完成設備的初始化。PCI Expansion ROM的入口地址由該PCI設備的配置空間30h地址處的Expansion ROM Base Address指明。PCI顯卡設備的Expansion ROM一般被特稱為VGA ROM,用于完成顯卡的低級初始化和中斷的設置。但是由于指令集的不兼容,龍芯2F無法正確解析和執(zhí)行這些指令,會出現(xiàn)無法預知的錯誤。
VGA BIOS模擬器就是為了解決這個問題而存在的。它在非x86架構的CPU上運行,模擬執(zhí)行VGA ROM中的代碼和中斷調(diào)用。VGA BIOS模擬器在邏輯上具有很好的內(nèi)聚性,對外設I/O、MMIO、PCI配置空間的訪問接口是模擬器和外界代碼進行交互的唯一界面。VGA ROM中的代碼指令類型相對固定,主要包括以下幾種類別:
①修改寄存器的值;
②修改存儲單元的值;
③修改外設I/O端口的值;
④修改外設MMIO端口的值;
⑤修改外設PCI配置空間的值。
據(jù)此,VGA BIOS模擬器所需具備的基本功能應該包括:
①能夠識別和執(zhí)行VGA ROM中的每一條指令;
②能夠完全模擬指令的后繼影響,包括中斷調(diào)用;
③能夠模擬和維護8086 CPU中的所有寄存器;
④提供一段空間來模擬對存儲器的讀寫操作;
⑤擁有和外界進行交互的界面,包括外設I/O、MMIO和PCI配置空間。
3.3 VGA BIOS模擬器搭建
為了支持對于中斷調(diào)用的模擬,VGA BIOS模擬器的搭建需要如下步驟:
(1)提供顯卡的設備描述
在U-Boot中提供一個全局變量,通過對這個變量的訪問,模擬器不需探測就可以知道平臺使用的是哪一個顯卡,同時可以方便地訪問到該設備的相關信息。
(2)設置抽象層的函數(shù)集合指針
設置模擬器中調(diào)用I/O訪問和MMIO模擬訪問的界面,設置默認的中斷處理函數(shù)。I/O訪問的函數(shù)指針為sys_inx和sys_outx,MMIO訪問的函數(shù)指針為sys_rdx和sys_wrx(x可以為b,w或者l)。這些函數(shù)指針在8086指令模擬的時候被調(diào)用,中斷處理函數(shù)的初始化則會在中斷指令模擬的時候進行。
(3)申請模擬器操作所需要的空間
一共需要申請分配3個空間,其中動態(tài)分配的有兩個,大小分別為1MB和64KB,另外還需一個不限定大小的對應于顯存的空間。1MB大小的空間用于模擬實模式下8086 CPU的地址空間,而64KB大小的空間用于模擬實模式地址空間的
3.2 VGA BIOS模擬器功能
通用顯卡的VGA ROM工作在實模式下,一般使用8086格式的匯編指令來編寫。非x86架構的CPU如果需要使用這種顯卡,就會遇到指令集兼容性的問題。按照顯卡的初始化流程,在顯卡的設備寄存器和內(nèi)存映射到CPU內(nèi)存空間中之后,龍芯2F已經(jīng)可以成功讀取到VGA ROM中的代碼指令,高64KB地址范圍。由于歷史的原因,實模式所用的1MB地址空間中的部分地址范圍有著其特定的作用。在VGA BIOS模擬器中需要關注的地址空間如表2所示。
表2 模擬器所需申請空間
(4)設置中斷向量表
中斷向量表位于所申請的1MB實模式內(nèi)存空間的0x00000—0x003FF地址范圍內(nèi)。中斷向量表一共包含256個中斷向量,其中每個中斷向量均分為段值和段內(nèi)偏移兩部分。在中斷調(diào)用時,段值和段內(nèi)偏移的值分別被賦予CS和IP寄存器,組合生成20位的線性地址,表示所調(diào)用的中斷例程所在的位置。在VGA BIOS模擬器中需要重點關注的2個中斷是int 10h中斷和int e6h中斷。
(5)將VGA ROM納入模擬器框架
由于模擬器實際執(zhí)行的指令都位于VGA ROM中,所以模擬器必須獲取VGA ROM的內(nèi)容并做出相應的處理。VGA BIOS模擬器在初始化時將VGA ROM復制到所申請的1MB實模式內(nèi)存空間中0xC0000--0xCFFFF地址范圍內(nèi),之后對VGA ROM的訪問就轉(zhuǎn)換為對該地址范圍的訪問。
3.4 VGA BIOS模擬器的運行
VGA BIOS模擬器的實際執(zhí)行過程就是讀取VGA ROM中的指令并模擬執(zhí)行,重點在于兩條中斷指令的模擬執(zhí)行。首先是通過對int e6h中斷的模擬執(zhí)行來實行VGA ROM代碼中中斷例程的安裝,為后續(xù)中斷調(diào)用創(chuàng)造執(zhí)行條件;然后是通過對int 10h中斷的模擬來實現(xiàn)顯卡framebuffer模式的設置。
中斷調(diào)用和普通的函數(shù)調(diào)用一樣,也可以接收多個參數(shù)來執(zhí)行不同的操作。在8086指令集中,指令序列的第一個字節(jié)是opcode,也就是說指令最多是256條。由于8086指令集是變長指令集,因此在獲取opcode之后,由opcode相對應的處理函數(shù)來處理后續(xù)的具體operand解析更為方便,模擬器中中斷調(diào)用的執(zhí)行流程如圖2所示。
圖2 模擬器中斷調(diào)用流程圖
有些指令比較特殊,可能前后兩條或者多條指令會有連帶影響。例如DATA指令(opcode為0x66),當模擬器遇到這條指令的時候,表示下一條指令操作的寄存器和立即數(shù)長度為32位。這時候模擬器會提供一個標志位,當下一條指令和立即數(shù)相關時,下一條指令的處理函數(shù)就會判斷這個標記位,進行不同的處理。這種標記位會在下一條指令執(zhí)行完成之后自動清除,不會帶來更進一步的影響。
本文介紹了U-Boot固件在YeeLoong 8089平臺的移植過程,重點描述了通用顯卡的初始化過程以及在非x86體系架構下使用通用顯卡的原理和方法。經(jīng)測試和實際用戶體驗,U-Boot現(xiàn)在已經(jīng)可以穩(wěn)定運行于該目標平臺,并可以成功啟動Linux Debian操作系統(tǒng)。但是與主流的x86平臺所使用的BIOS相比,U-Boot基于文字的界面對于普通用戶的友好度仍有待于提高。因此如何提高系統(tǒng)界面的友好性和交互性將是今后工作的重點。
[1]Loongson Technology Corporation Limited.Loongson 2F User Manual v1.5[Z].2013.[龍芯中科技術有限公司.龍芯2F處理器用戶手冊v1.5[Z].2013.
[2]Loongson Technology Corporation Limited.Loongson 2F Data Sheet v1.1[Z].2013.[龍芯中科技術有限公司.龍芯2F處理器數(shù)據(jù)手冊v1.1[Z].2013.
[3]Loongson Technology Corporation Limited.Loongson Processor White Paper v2.0[Z].2014.[龍芯中科技術有限公司.龍芯芯片產(chǎn)品技術白皮書v2.0[Z].2014.
[4]PCI Special Interest Group.PCI Local Bus Specification (Revision 2.3)[S].2002.
[5]Video Electronics Standards Association.VESA BIOS EXTENSION(VBE)Core Functions Standard(Version 3.0) [S].1998.
[6]Advanced Micro Devices,Inc.AMD GeodeTM CS5536 Companion Device Data Book[Z].2007.
[7]Dominic Sweetman.See MIPS Run,Second Edition[M]. Morgan Kaufmann publications,2007.
[8]Tommy Noergaard.Embedded Systems Architecture:A Comprehensive Guide for Engineers and Programmers, Second Edition[M].Newnes,2008.
[9]李雷,鄭為民,劉金剛.基于PMON的龍芯BIOS初始化及VGA BIOS模擬器[J].計算機工程,2009,35(1):204-206.
[10]張菊莉,張君毅,孟小鎖.基于龍芯2F架構的PMON分析與優(yōu)化[J].現(xiàn)代電子技術,2011,34(2):19-21.
Firmware Porting and Video Card Optimization of U-Boot Based on Loongson 2F
HE Chao-yong,QIAN Xiao-jie
(School of Information Engineering,Zhengzhou University,Zhengzhou He’nan 450001,China)
In order to improve the extensibility of Yeeloong 8089 platform based on Loongson 2F,the basic structure and the porting process of the U-Boot firmware on this platform are described.The initialization process of PCI devices,especially of video care,is presented.The use of general graphic cards on the non-x86 architecture platform is implemented by introducing video graphics array (VGA)basic input/output system(BIOS)emulator into the U-Boot.The test results show that U-Boot can run stably on Yeeloong 8089 platform,and can correctly display the startup information through the video card and successfully boot the Debian Linux kernel.
Loongson 2F;U-Boot;simulator;video card;porting
TP311.54
A
1008-1739(2015)12-72-4
定稿日期:2015-05-26