基于MIPS64的嵌入式Linux Bootloader的移植
1引言 linux具備良好的裁剪性和移植性,并且開(kāi)源、資源豐富,已成為嵌入式系統(tǒng)的開(kāi)發(fā)熱點(diǎn)。一個(gè)完整的嵌入式linux系通通常包括bootloader、內(nèi)核、文件系統(tǒng)三部分,目標(biāo)板上電后由bootloader初始化硬件,引導(dǎo)內(nèi)核和文件系統(tǒng)來(lái)啟動(dòng)linux。但由于在嵌入式開(kāi)發(fā)中基于mips體系的bootloader較少,開(kāi)發(fā)者在移植mips bootloader需花費(fèi)大量精力。結(jié)合octeon3010(mips64)的u-boot移植經(jīng)驗(yàn),分析嵌入式linuxbootloader的工作原理及功能,設(shè)計(jì)了一個(gè)基于mips體系的bootloader模型。對(duì)octeon系列的mips處理器bootloader的設(shè)計(jì)具有參考價(jià)值和指導(dǎo)意義?! ? bootloader原理分析 bootloader是在運(yùn)行操作系統(tǒng)內(nèi)核前所執(zhí)行的一段小程序。通過(guò)執(zhí)行這段小程序,實(shí)現(xiàn)初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而為系統(tǒng)的軟硬件環(huán)境設(shè)置一個(gè)合適狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確環(huán)境?! 〈蠖鄶?shù)bootloader包含"啟動(dòng)加載"和"下載"兩種操作模式。從最終用戶來(lái)看,bootloader就是用來(lái)加載操作系統(tǒng),而無(wú)工作模式區(qū)別。其中,啟動(dòng)加載模式是bootloader從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備將操作系統(tǒng)加載到ram中運(yùn)行,整個(gè)過(guò)程并沒(méi)有用戶介入。這種模式是bootloader的正常工作模式。而在下載模式下,目標(biāo)機(jī)上的bootloader通過(guò)串口連接或網(wǎng)絡(luò)連接從主機(jī)(host)下載文件,例如下載內(nèi)核映像和根文件系統(tǒng)映像等。 由于實(shí)現(xiàn)bootloader依賴cpu的體系結(jié)構(gòu),因此大多數(shù)bootloader分為stage1和stage2兩部分,并依賴于cpu體系結(jié)構(gòu)的代碼,例如:設(shè)備初始化代碼等,通常放在stage1中,一般采用匯編語(yǔ)言。而stage2則通常采用c語(yǔ)言實(shí)現(xiàn)復(fù)雜功能,而且代碼具有良好的可讀性和移植性。stage1步驟通常包括:硬件設(shè)備初始化;為加載bootloader的stage2準(zhǔn)備ram空間;拷貝bootloader的stage2到ram空間中;設(shè)置好堆棧;跳轉(zhuǎn)到stage2的c入口點(diǎn)。bootloader的stage2步驟通常包括:初始化當(dāng)前階段使用的硬件設(shè)備;檢測(cè)系統(tǒng)內(nèi)存映射;將kernel映像和根文件系統(tǒng)映像從flash上讀到ram空間中;為內(nèi)核設(shè)置啟動(dòng)參數(shù);調(diào)用內(nèi)核?! ?設(shè)計(jì)移植 3.1啟動(dòng)流程 針對(duì)具體的硬件內(nèi)容,詳細(xì)分析u-boot的啟動(dòng)流程后,給出啟動(dòng)流程中需要修改的代碼?! ?.2移植分析 片級(jí)移植主要是針對(duì)具體cpu初始化代碼的修改,針對(duì)對(duì)應(yīng)的mips平臺(tái),主要包括:通用寄存器的初始化、cp0的初始化(status,config,watch,count,compare,etc.)、watchdog初始化、cache初始化、tlb初始化。板級(jí)移植包括:串口驅(qū)動(dòng)、flash讀寫(xiě)驅(qū)動(dòng)(nor,nand)、hd讀寫(xiě)驅(qū)動(dòng)、網(wǎng)卡驅(qū)動(dòng)。而功能層擴(kuò)展可根據(jù)需求添加新功能或裁減優(yōu)化,包括調(diào)試功能、啟動(dòng)功能、下載功能等?! ?.3修改代碼 主要修改的代碼為:makefile添加開(kāi)發(fā)板的編譯支持;include/configs/myboard.h開(kāi)發(fā)板的定義,啟動(dòng)參數(shù)等;cpu/mips/start.s修改初始化代碼和入口;board/myboard/flash.c對(duì)應(yīng)的nor flash驅(qū)動(dòng);board/myboard/myboard.c對(duì)應(yīng)的板級(jí)初始化代碼;board/myboard/lowlevel_init.s初始化硬件的匯編代碼;board/myboard/serial.c串口驅(qū)動(dòng)?! ? octeon系列cpu的硬件初始化實(shí)例 4.1開(kāi)發(fā)環(huán)境及硬件平臺(tái)簡(jiǎn)介 采用的是宿主機(jī)+目標(biāo)板的開(kāi)發(fā)模式,宿主機(jī)為pc+fc6,目標(biāo)板的cpu采用基于mips64 v2體系結(jié)構(gòu)的處理器octeon_cn3010,nor flash采用amd公司8 mb的am-29dl640g.sdram采用三星公司512 mb的m378t6553cz3-cd5(64 mb×8 bit)。存儲(chǔ)部分的硬件連接如圖1所示。
4.2具體實(shí)現(xiàn)代碼 系統(tǒng)的起始地址統(tǒng)一規(guī)定為0xbfc00000,加電后,cpu從該地址開(kāi)始執(zhí)行。該地址也就是系統(tǒng)異常處理向量表的第一項(xiàng)(reset)。0xbfc00000處的中斷向量表起始處的跳轉(zhuǎn)命令,跳到了inittlbstart中,完成了系統(tǒng)的大部分初始化,例如設(shè)置寄存器、cpu、sdram、flash等。以下為具體程序代碼:
系統(tǒng)完成初始化后,跳轉(zhuǎn)到board.c。在board.c中的checkboard()函數(shù)將進(jìn)一步設(shè)置cpu、sdram、cache、串口等,并將硬件初始化代碼從flash拷貝到sdram中繼續(xù)運(yùn)行,最后調(diào)用main_loop()函數(shù),進(jìn)入bootloader的第一個(gè)c函數(shù)-main_loop()函數(shù),在這個(gè)函數(shù)中將初始化硬件平臺(tái)相關(guān)的參數(shù)、模塊,并優(yōu)化參數(shù),設(shè)置loader參數(shù)等硬件初始化?! ?.3 bootloader的燒錄和啟動(dòng) 使用flash燒錄器把生成的u-boot.bin文件燒錄到flash后,將其放人目標(biāo)板的flash槽。目標(biāo)板通電后,串口輸出數(shù)據(jù)。至此,bootloader被成功移植。 5結(jié)語(yǔ) 通過(guò)分析引導(dǎo)轉(zhuǎn)載系統(tǒng)在嵌入式linux系統(tǒng)中的工作原理及功能,結(jié)合移植經(jīng)驗(yàn),設(shè)計(jì)了一個(gè)基于mips體系