• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

      2015-06-21 15:07:42何超勇錢曉捷
      關(guān)鍵詞:龍芯固件模擬器

      何超勇錢曉捷

      (鄭州大學(xué)信息工程學(xué)院,河南鄭州450001)

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

      何超勇錢曉捷

      (鄭州大學(xué)信息工程學(xué)院,河南鄭州450001)

      為提高基于龍芯2F的Yeeloong 8089平臺(tái)的擴(kuò)展性,闡述了U-Boot固件的基本架構(gòu)和在該平臺(tái)上的移植過程。描述了PCI設(shè)備特別是顯卡的初始化過程,通過在U-Boot中引入視頻圖形陣列(VGA)基本輸入輸出系統(tǒng)(BIOS)模擬器的方式解決了在非x86架構(gòu)平臺(tái)上使用通用顯卡的問題。經(jīng)過調(diào)試和驗(yàn)證,U-Boot穩(wěn)定運(yùn)行于Yeeloong 8089平臺(tái),能夠通過顯卡顯示啟動(dòng)信息,并可以成功引導(dǎo)Debian Linux內(nèi)核。

      龍芯2F U-Boot 模擬器 顯卡 移植

      1 引言

      龍芯2F是一款由中科院計(jì)算所于2007年研制的高性能低功耗64位通用處理器。該處理器完整實(shí)現(xiàn)了MIPS III指令集,采用CMOS 90nm工藝制造,主頻為1GHz并且支持軟件動(dòng)態(tài)調(diào)節(jié)處理器頻率。因?yàn)橹饕嫦蜃烂鎽?yīng)用,所以在芯片內(nèi)集成了DDR2內(nèi)存控制器、PCI/PCI-X總線控制器、Local-Bus接口、中斷控制器以及視頻加速單元。

      在嵌入式系統(tǒng)中,固件兼具PC機(jī)BIOS和bootloader(如GRUB、LILO)的功能,主要負(fù)責(zé)開機(jī)時(shí)對(duì)系統(tǒng)的硬件進(jìn)行初始化和測(cè)試,并根據(jù)測(cè)試結(jié)果來(lái)引導(dǎo)操作系統(tǒng)內(nèi)核或者將出錯(cuò)信息反饋給用戶。由于該過程和具體硬件密切相關(guān),固件一般都依賴于CPU的體系結(jié)構(gòu)和板級(jí)硬件配置,基本沒有通用性,至少需要移植和優(yōu)化改進(jìn)。

      逸瓏(Yeeloong)8089是由江蘇中科夢(mèng)蘭電子科技有限公司推出的一款采用龍芯2F處理器和嵌入式系統(tǒng)架構(gòu)的創(chuàng)新型筆記本電腦產(chǎn)品,摒棄了在x86體系計(jì)算機(jī)上沿襲多年的BIOS,轉(zhuǎn)而使用固件來(lái)直接加載和引導(dǎo)操作系統(tǒng)內(nèi)核。本文總結(jié)了基于該平臺(tái)U-Boot固件移植過程中的關(guān)鍵問題,并針對(duì)非x86架構(gòu)平臺(tái)下通用顯卡的優(yōu)化實(shí)現(xiàn)進(jìn)行了詳述。

      2 U-Boot移植

      U-Boot是由德國(guó)的DENX小組所開發(fā)的一款應(yīng)用廣泛的嵌入式系統(tǒng)固件開源軟件,支持ARM、AVR32、Blackfin、MicroBlaze、MIPS、Nios、PowerPC、x86等數(shù)量眾多的處理器架構(gòu)平臺(tái)。U-Boot遵循GPL軟件協(xié)議,向所有用戶開放源代碼,具有清晰簡(jiǎn)潔的代碼樹結(jié)構(gòu),并且文檔資料和社區(qū)支持非常豐富。Yeeloong 8089平臺(tái)目前所使用的固件系統(tǒng)為PMON 2000,該固件雖然能夠滿足基本的功能應(yīng)用,但是其軟件本身代碼結(jié)構(gòu)雜亂無(wú)序、移植困難,社區(qū)趨于癱瘓,用戶數(shù)量匱乏,對(duì)后續(xù)的開發(fā)和功能擴(kuò)展十分不利。因此,移植U-Boot到Y(jié)eeloong 8089平臺(tái),不僅能夠豐富平臺(tái)的應(yīng)用,還能夠有效提升該平臺(tái)在開發(fā)者群體中的影響力。

      2.1 U-Boot目錄結(jié)構(gòu)

      U-Boot的主要功能包括硬件系統(tǒng)的檢測(cè)和初始化、U-Boot命令行狀態(tài)下各命令的穩(wěn)定運(yùn)行以及操作系統(tǒng)的正常引導(dǎo)。U-Boot采取了與Linux相類似的模塊劃分方式,同時(shí)考慮到了跨平臺(tái)移植的問題。如表1所示,在U-Boot源代碼主目錄下,所有的源代碼文件和配置文件都根據(jù)其性質(zhì)和作用被組織于不同的子目錄中。U-Boot的16個(gè)一級(jí)子目錄,總體可以劃分為3個(gè)類型:

      ①平臺(tái)相關(guān):主要是硬件和體系結(jié)構(gòu)相關(guān);②通用:主要是通用函數(shù)和驅(qū)動(dòng)程序

      ③支持:主要是各種應(yīng)用程序、工具和文檔

      表1 U-Boot一級(jí)子目錄功能和類型

      U-Boot的移植過程中所需要考慮的基本都是平臺(tái)相關(guān)類型的子目錄。U-Boot支持多種體系結(jié)構(gòu)和上百種類型的開發(fā)板,對(duì)于特定的體系結(jié)構(gòu)和開發(fā)板,移植過程主要是通過配置文件來(lái)選定相應(yīng)的代碼,同時(shí)依據(jù)實(shí)際需要來(lái)進(jìn)行裁剪、添加和優(yōu)化。

      2.2 基于Yeeloong 8089平臺(tái)的U-Boot移植

      龍芯2F在啟動(dòng)時(shí)需要根據(jù)BEV寄存器的值來(lái)判斷入口地址。當(dāng)系統(tǒng)為冷啟動(dòng)時(shí),BEV的值為1,入口地址為0xbfc00000;當(dāng)系統(tǒng)為熱啟動(dòng)時(shí),BEV的值為0,入口地址為0x80000000。當(dāng)目標(biāo)主板上電冷啟動(dòng)時(shí),龍芯2F將從0xbfc00000地址處取指令開始運(yùn)行,而該地址從硬件上被映射到系統(tǒng)固件Flash芯片的第一條指令,也就是U-Boot的第一條指令。

      U-Boot的啟動(dòng)分為stage1和stage2兩個(gè)階段:

      (1)Stage1階段

      與體系結(jié)構(gòu)、硬件配置密切相關(guān)。該部分代碼主要用匯編語(yǔ)言實(shí)現(xiàn),目的在于提高程序的執(zhí)行效率。主要實(shí)現(xiàn)CPU、RAM、Nand Flash、Cache的初始化,建立臨時(shí)堆棧,將U-boot加載到RAM,以及建立內(nèi)存重定位和映射,為Stage2準(zhǔn)備運(yùn)行環(huán)境。

      (2)Stage2階段

      主要實(shí)現(xiàn)通用的功能,如相關(guān)協(xié)議、Shell命令等。該部分代碼用C語(yǔ)言實(shí)現(xiàn),目的在于提高程序的可讀性和移植性。主要實(shí)現(xiàn)初始化其余硬件,將內(nèi)核加載到RAM,檢測(cè)系統(tǒng)內(nèi)存映射,設(shè)置啟動(dòng)參數(shù),為內(nèi)核準(zhǔn)備運(yùn)行環(huán)境。

      U-Boot移植過程中主要使用ELDK(The Embedded Linux Development Kit)編譯工具,該工具是由U-Boot項(xiàng)目主要維護(hù)人Wolfgang Denk所在的德國(guó)DENX軟件工程公司所推出的嵌入式Linux開發(fā)套件,其中包含了GNU交叉編譯開發(fā)工具、一些已經(jīng)編譯好的目標(biāo)工具和提供在目標(biāo)平臺(tái)上進(jìn)行函數(shù)調(diào)用的庫(kù)文件。

      基于Yeeloong 8089平臺(tái),U-Boot的移植的主要步驟:

      ①在源代碼根目錄的Makefile文件中,添加目標(biāo)平臺(tái)的配置信息;

      ②在board目錄下,創(chuàng)建目標(biāo)平臺(tái)主板目錄,并添加相應(yīng)的板級(jí)初始化代碼和配置文件;

      ③在include/configs目錄下,創(chuàng)建包含目標(biāo)平臺(tái)主板設(shè)置參數(shù)的頭文件;

      ④在arch/mips目錄下,創(chuàng)建龍芯2F目錄,并添加相應(yīng)的片級(jí)初始化代碼和配置文件;

      ⑤對(duì)代碼進(jìn)行配置和編譯;

      ⑥調(diào)試并解決存在的問題。

      在上述移植過程中,主要包括了片級(jí)移植和板級(jí)移植。其中片級(jí)移植和龍芯2F芯片相關(guān),主要涉及Start.S和board.c這2個(gè)文件,其中的代碼用于完成龍芯2F通用寄存器的初始化、CPO協(xié)處理器的初始化、Watchdog的初始化、Cache的初始化。板級(jí)移植和目標(biāo)主板相關(guān),涉及board子目錄、common子目錄、net子目錄、driver子目錄等多個(gè)文件,其中的代碼主要是初始化相關(guān)硬件并為之提供驅(qū)動(dòng)程序。

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

      在YeeLoong 8089目標(biāo)平臺(tái)主板上,龍芯2F處理器通過PCI總線來(lái)對(duì)AMD CS5536南橋芯片、Sillion SM712顯卡、RTL8139D網(wǎng)卡以及攝像頭等主要外部設(shè)備進(jìn)行連接和控制。移植后的U-Boot可以穩(wěn)定運(yùn)行于該目標(biāo)平臺(tái)主板上,但是還需要進(jìn)行一些優(yōu)化工作,主要是解決在龍芯2F這樣的非x86架構(gòu)平臺(tái)上使用通用顯卡的問題。

      3.1 顯卡初始化原理

      在系統(tǒng)上電之后,固件需要通過掃描PCI總線來(lái)確定系統(tǒng)擁有的PCI設(shè)備,因此每一個(gè)PCI設(shè)備都需要實(shí)現(xiàn)一個(gè)PCI配置空間。PCI設(shè)備的配置空間大小為256字節(jié),由多個(gè)寄存器組成,分為預(yù)定義部分和設(shè)備獨(dú)立部分,典型PCI設(shè)備的配置空間如圖1所示。

      圖1 PCI設(shè)備配置空間圖

      除了用于設(shè)備鑒別的Vendor ID、Device ID、Revision ID、Header Type和Class Code這5個(gè)寄存器是每個(gè)PCI設(shè)備都需要實(shí)現(xiàn)的以外,圖1所示的其他寄存器都是由生產(chǎn)廠家根據(jù)PCI設(shè)備的類型和功能來(lái)決定是否實(shí)現(xiàn)。

      在固件啟動(dòng)操作系統(tǒng)之前,必須建立一個(gè)統(tǒng)一的系統(tǒng)地址空間。固件通過掃描PCI總線,讀取PCI設(shè)備的配置空間,PCI設(shè)備的寄存器(除了PCI配置寄存器)和內(nèi)存(RAM和ROM)就可以通過一組特殊的寄存器,即圖1所示10h--24h地址處的BAR(Base Address Register)來(lái)映射到CPU Memory空間或者CPU I/O空間中的特定地址,這樣就可以避免不同PCI設(shè)備之間發(fā)生地址沖突。這個(gè)過程就被稱為PCI設(shè)備的初始化過程,只有經(jīng)過初始化的PCI設(shè)備才可以被正確訪問和使用。

      但是由于一些PCI設(shè)備(例如顯卡)的復(fù)雜性較高,在該過程之后還需要設(shè)備專有的PCI Expansion ROM代碼,來(lái)進(jìn)一步完成設(shè)備的初始化。PCI Expansion ROM的入口地址由該P(yáng)CI設(shè)備的配置空間30h地址處的Expansion ROM Base Address指明。PCI顯卡設(shè)備的Expansion ROM一般被特稱為VGA ROM,用于完成顯卡的低級(jí)初始化和中斷的設(shè)置。但是由于指令集的不兼容,龍芯2F無(wú)法正確解析和執(zhí)行這些指令,會(huì)出現(xiàn)無(wú)法預(yù)知的錯(cuò)誤。

      VGA BIOS模擬器就是為了解決這個(gè)問題而存在的。它在非x86架構(gòu)的CPU上運(yùn)行,模擬執(zhí)行VGA ROM中的代碼和中斷調(diào)用。VGA BIOS模擬器在邏輯上具有很好的內(nèi)聚性,對(duì)外設(shè)I/O、MMIO、PCI配置空間的訪問接口是模擬器和外界代碼進(jìn)行交互的唯一界面。VGA ROM中的代碼指令類型相對(duì)固定,主要包括以下幾種類別:

      ①修改寄存器的值;

      ②修改存儲(chǔ)單元的值;

      ③修改外設(shè)I/O端口的值;

      ④修改外設(shè)MMIO端口的值;

      ⑤修改外設(shè)PCI配置空間的值。

      據(jù)此,VGA BIOS模擬器所需具備的基本功能應(yīng)該包括:

      ①能夠識(shí)別和執(zhí)行VGA ROM中的每一條指令;

      ②能夠完全模擬指令的后繼影響,包括中斷調(diào)用;

      ③能夠模擬和維護(hù)8086 CPU中的所有寄存器;

      ④提供一段空間來(lái)模擬對(duì)存儲(chǔ)器的讀寫操作;

      ⑤擁有和外界進(jìn)行交互的界面,包括外設(shè)I/O、MMIO和PCI配置空間。

      3.3 VGA BIOS模擬器搭建

      為了支持對(duì)于中斷調(diào)用的模擬,VGA BIOS模擬器的搭建需要如下步驟:

      (1)提供顯卡的設(shè)備描述

      在U-Boot中提供一個(gè)全局變量,通過對(duì)這個(gè)變量的訪問,模擬器不需探測(cè)就可以知道平臺(tái)使用的是哪一個(gè)顯卡,同時(shí)可以方便地訪問到該設(shè)備的相關(guān)信息。

      (2)設(shè)置抽象層的函數(shù)集合指針

      設(shè)置模擬器中調(diào)用I/O訪問和MMIO模擬訪問的界面,設(shè)置默認(rèn)的中斷處理函數(shù)。I/O訪問的函數(shù)指針為sys_inx和sys_outx,MMIO訪問的函數(shù)指針為sys_rdx和sys_wrx(x可以為b,w或者l)。這些函數(shù)指針在8086指令模擬的時(shí)候被調(diào)用,中斷處理函數(shù)的初始化則會(huì)在中斷指令模擬的時(shí)候進(jìn)行。

      (3)申請(qǐng)模擬器操作所需要的空間

      一共需要申請(qǐng)分配3個(gè)空間,其中動(dòng)態(tài)分配的有兩個(gè),大小分別為1MB和64KB,另外還需一個(gè)不限定大小的對(duì)應(yīng)于顯存的空間。1MB大小的空間用于模擬實(shí)模式下8086 CPU的地址空間,而64KB大小的空間用于模擬實(shí)模式地址空間的

      3.2 VGA BIOS模擬器功能

      通用顯卡的VGA ROM工作在實(shí)模式下,一般使用8086格式的匯編指令來(lái)編寫。非x86架構(gòu)的CPU如果需要使用這種顯卡,就會(huì)遇到指令集兼容性的問題。按照顯卡的初始化流程,在顯卡的設(shè)備寄存器和內(nèi)存映射到CPU內(nèi)存空間中之后,龍芯2F已經(jīng)可以成功讀取到VGA ROM中的代碼指令,高64KB地址范圍。由于歷史的原因,實(shí)模式所用的1MB地址空間中的部分地址范圍有著其特定的作用。在VGA BIOS模擬器中需要關(guān)注的地址空間如表2所示。

      表2 模擬器所需申請(qǐng)空間

      (4)設(shè)置中斷向量表

      中斷向量表位于所申請(qǐng)的1MB實(shí)模式內(nèi)存空間的0x00000—0x003FF地址范圍內(nèi)。中斷向量表一共包含256個(gè)中斷向量,其中每個(gè)中斷向量均分為段值和段內(nèi)偏移兩部分。在中斷調(diào)用時(shí),段值和段內(nèi)偏移的值分別被賦予CS和IP寄存器,組合生成20位的線性地址,表示所調(diào)用的中斷例程所在的位置。在VGA BIOS模擬器中需要重點(diǎn)關(guān)注的2個(gè)中斷是int 10h中斷和int e6h中斷。

      (5)將VGA ROM納入模擬器框架

      由于模擬器實(shí)際執(zhí)行的指令都位于VGA ROM中,所以模擬器必須獲取VGA ROM的內(nèi)容并做出相應(yīng)的處理。VGA BIOS模擬器在初始化時(shí)將VGA ROM復(fù)制到所申請(qǐng)的1MB實(shí)模式內(nèi)存空間中0xC0000--0xCFFFF地址范圍內(nèi),之后對(duì)VGA ROM的訪問就轉(zhuǎn)換為對(duì)該地址范圍的訪問。

      3.4 VGA BIOS模擬器的運(yùn)行

      VGA BIOS模擬器的實(shí)際執(zhí)行過程就是讀取VGA ROM中的指令并模擬執(zhí)行,重點(diǎn)在于兩條中斷指令的模擬執(zhí)行。首先是通過對(duì)int e6h中斷的模擬執(zhí)行來(lái)實(shí)行VGA ROM代碼中中斷例程的安裝,為后續(xù)中斷調(diào)用創(chuàng)造執(zhí)行條件;然后是通過對(duì)int 10h中斷的模擬來(lái)實(shí)現(xiàn)顯卡framebuffer模式的設(shè)置。

      中斷調(diào)用和普通的函數(shù)調(diào)用一樣,也可以接收多個(gè)參數(shù)來(lái)執(zhí)行不同的操作。在8086指令集中,指令序列的第一個(gè)字節(jié)是opcode,也就是說(shuō)指令最多是256條。由于8086指令集是變長(zhǎng)指令集,因此在獲取opcode之后,由opcode相對(duì)應(yīng)的處理函數(shù)來(lái)處理后續(xù)的具體operand解析更為方便,模擬器中中斷調(diào)用的執(zhí)行流程如圖2所示。

      圖2 模擬器中斷調(diào)用流程圖

      有些指令比較特殊,可能前后兩條或者多條指令會(huì)有連帶影響。例如DATA指令(opcode為0x66),當(dāng)模擬器遇到這條指令的時(shí)候,表示下一條指令操作的寄存器和立即數(shù)長(zhǎng)度為32位。這時(shí)候模擬器會(huì)提供一個(gè)標(biāo)志位,當(dāng)下一條指令和立即數(shù)相關(guān)時(shí),下一條指令的處理函數(shù)就會(huì)判斷這個(gè)標(biāo)記位,進(jìn)行不同的處理。這種標(biāo)記位會(huì)在下一條指令執(zhí)行完成之后自動(dòng)清除,不會(huì)帶來(lái)更進(jìn)一步的影響。

      4 結(jié)束語(yǔ)

      本文介紹了U-Boot固件在YeeLoong 8089平臺(tái)的移植過程,重點(diǎn)描述了通用顯卡的初始化過程以及在非x86體系架構(gòu)下使用通用顯卡的原理和方法。經(jīng)測(cè)試和實(shí)際用戶體驗(yàn),U-Boot現(xiàn)在已經(jīng)可以穩(wěn)定運(yùn)行于該目標(biāo)平臺(tái),并可以成功啟動(dòng)Linux Debian操作系統(tǒng)。但是與主流的x86平臺(tái)所使用的BIOS相比,U-Boot基于文字的界面對(duì)于普通用戶的友好度仍有待于提高。因此如何提高系統(tǒng)界面的友好性和交互性將是今后工作的重點(diǎn)。

      [1]Loongson Technology Corporation Limited.Loongson 2F User Manual v1.5[Z].2013.[龍芯中科技術(shù)有限公司.龍芯2F處理器用戶手冊(cè)v1.5[Z].2013.

      [2]Loongson Technology Corporation Limited.Loongson 2F Data Sheet v1.1[Z].2013.[龍芯中科技術(shù)有限公司.龍芯2F處理器數(shù)據(jù)手冊(cè)v1.1[Z].2013.

      [3]Loongson Technology Corporation Limited.Loongson Processor White Paper v2.0[Z].2014.[龍芯中科技術(shù)有限公司.龍芯芯片產(chǎn)品技術(shù)白皮書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].計(jì)算機(jī)工程,2009,35(1):204-206.

      [10]張菊莉,張君毅,孟小鎖.基于龍芯2F架構(gòu)的PMON分析與優(yōu)化[J].現(xiàn)代電子技術(shù),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

      猜你喜歡
      龍芯固件模擬器
      基于國(guó)產(chǎn)化龍芯的動(dòng)環(huán)數(shù)據(jù)采集系統(tǒng)
      了不起的安檢模擬器
      盲盒模擬器
      劃船模擬器
      基于固件的遠(yuǎn)程身份認(rèn)證
      “龍芯之父”胡偉武
      龍芯發(fā)布新一代處理器產(chǎn)品
      提取ROM固件中的APP
      電腦愛好者(2015年7期)2015-04-09 08:54:02
      動(dòng)態(tài)飛行模擬器及其發(fā)展概述
      一種通過USB接口的可靠固件升級(jí)技術(shù)
      南部县| 永兴县| 邵阳市| 光泽县| 沙湾县| 濉溪县| 营山县| 武城县| 沿河| 宜黄县| 罗定市| 托克托县| 大荔县| 牡丹江市| 卢氏县| 仁寿县| 胶南市| 巢湖市| 张家港市| 富锦市| 巨鹿县| 磐石市| 永仁县| 千阳县| 高清| 大同县| 辽源市| 仙桃市| 宁明县| 玉门市| 堆龙德庆县| 乌兰浩特市| 周宁县| 宜兰县| 绥德县| 洞口县| 洱源县| 天峻县| 安阳县| 无锡市| 姚安县|