国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于龍芯2F的U-Boot固件移植與顯卡優(yōu)化

2015-06-21 15:07:42何超勇錢曉捷
計算機與網(wǎng)絡 2015年12期
關鍵詞:龍芯固件模擬器

何超勇錢曉捷

(鄭州大學信息工程學院,河南鄭州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 模擬器 顯卡 移植

1 引言

龍芯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)進行了詳述。

2 U-Boot移植

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ū)動程序。

3 基于Yeeloong 8089平臺的U-Boot優(yōu)化

在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í)行完成之后自動清除,不會帶來更進一步的影響。

4 結束語

本文介紹了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

猜你喜歡
龍芯固件模擬器
基于國產(chǎn)化龍芯的動環(huán)數(shù)據(jù)采集系統(tǒng)
了不起的安檢模擬器
盲盒模擬器
劃船模擬器
基于固件的遠程身份認證
“龍芯之父”胡偉武
華人時刊(2016年13期)2016-04-05 05:50:06
龍芯發(fā)布新一代處理器產(chǎn)品
提取ROM固件中的APP
電腦愛好者(2015年7期)2015-04-09 08:54:02
動態(tài)飛行模擬器及其發(fā)展概述
一種通過USB接口的可靠固件升級技術
徐水县| 太仆寺旗| 光泽县| 广汉市| 诸城市| 巴彦淖尔市| 灵石县| 合阳县| 池州市| 巴南区| 曲周县| 镇江市| 启东市| 岳阳县| 西林县| 南郑县| 冀州市| 浮山县| 靖州| 新晃| 贺兰县| 广丰县| 张家港市| 云霄县| 怀集县| 长乐市| 如皋市| 廊坊市| 千阳县| 连江县| 普定县| 丰县| 孝昌县| 莫力| 嘉兴市| 化州市| 阿合奇县| 布尔津县| 金华市| 农安县| 屯留县|