當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]u-boot啟動(dòng)過(guò)程分析——基于lpc2210的移植代碼

u-boot是一種普遍用于嵌入式系統(tǒng)中的Bootloader。

Bootloader介紹

Bootloader是進(jìn)行嵌入式開(kāi)發(fā)必然會(huì)接觸的一個(gè)概念,它是嵌入式學(xué)院<嵌入式工程師職業(yè)培訓(xùn)班>二期課程中嵌入式linux系統(tǒng)開(kāi)發(fā)方面的重要內(nèi)容。本篇文章主要講解Bootloader的基本概念以及內(nèi)部原理,這部分內(nèi)容的掌握將對(duì)嵌入式linux系統(tǒng)開(kāi)發(fā)的學(xué)習(xí)非常有幫助!

Bootloader的定義:Bootloader是在操作系統(tǒng)運(yùn)行之前執(zhí)行的一小段程序,通過(guò)這一小段程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射表,從而建立適當(dāng)?shù)南到y(tǒng)軟硬件環(huán)境,為最終調(diào)用操作系統(tǒng)內(nèi)核做好準(zhǔn)備。意思就是說(shuō)如果我們要想讓一個(gè)操作系統(tǒng)在我們的板子上運(yùn)轉(zhuǎn)起來(lái),我們就必須首先對(duì)我們的板子進(jìn)行一些基本配置和初始化,然后才可以將操作系統(tǒng)引導(dǎo)進(jìn)來(lái)運(yùn)行。具體在Bootloader中完成了哪些操作我們會(huì)在后面分析到,這里我們先來(lái)回憶一下PC的體系結(jié)構(gòu):PC機(jī)中的引導(dǎo)加載程序是由BIOS和位于硬盤(pán)MBR中的OS Boot Loader(比如LILO和GRUB等)一起組成的,BIOS在完成硬件檢測(cè)和資源分配后,將硬盤(pán)MBR中的Boot Loader讀到系統(tǒng)的RAM中,然后將控制權(quán)交給OS Boot Loader。Boot Loader的主要運(yùn)行任務(wù)就是將內(nèi)核映象從硬盤(pán)上讀到RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)去運(yùn)行,即開(kāi)始啟動(dòng)操作系統(tǒng)。在嵌入式系統(tǒng)中,通常并沒(méi)有像BIOS那樣的固件程序(注:有的嵌入式cpu也會(huì)內(nèi)嵌一段短小的啟動(dòng)程序),因此整個(gè)系統(tǒng)的加載啟動(dòng)任務(wù)就完全由Boot Loader來(lái)完成。比如在一個(gè)基于ARM7TDMI core的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址0x00000000處開(kāi)始執(zhí)行,而在這個(gè)地址處安排的通常就是系統(tǒng)的Boot Loader程序。(先想一下,通用PC和嵌入式系統(tǒng)為何會(huì)在此處存在如此的差異呢?)

Bootloader是基于特定硬件平臺(tái)來(lái)實(shí)現(xiàn)的,因此幾乎不可能為所有的嵌入式系統(tǒng)建立一個(gè)通用的Bootloader,不同的處理器架構(gòu)都有不同的Bootloader,Bootloader不但依賴(lài)于cpu的體系結(jié)構(gòu),還依賴(lài)于嵌入式系統(tǒng)板級(jí)設(shè)備的配置。對(duì)于2塊不同的板子而言,即使他們使用的是相同的處理器,要想讓運(yùn)行在一塊板子上的Bootloader程序也能運(yùn)行在另一塊板子上,一般也需要修改Bootloader的源程序。

Bootloader的啟動(dòng)方式

Bootloader的啟動(dòng)方式主要有網(wǎng)絡(luò)啟動(dòng)方式、磁盤(pán)啟動(dòng)方式和Flash啟動(dòng)方式。

1、網(wǎng)絡(luò)啟動(dòng)方式

 

 

圖1 Bootloader網(wǎng)絡(luò)啟動(dòng)方式示意圖

如圖1所示,里面主機(jī)和目標(biāo)板,他們中間通過(guò)網(wǎng)絡(luò)來(lái)連接,首先目標(biāo)板的DHCP/BIOS通過(guò)BOOTP服務(wù)來(lái)為Bootloader分配IP地址,配置網(wǎng)絡(luò)參數(shù),這樣才能支持網(wǎng)絡(luò)傳輸功能。我們使用的u-boot可以直接設(shè)置網(wǎng)絡(luò)參數(shù),因此這里就不用使用DHCP的方式動(dòng)態(tài)分配IP了。接下來(lái)目標(biāo)板的Bootloader通過(guò)TFTP服務(wù)將內(nèi)核映像下載到目標(biāo)板上,然后通過(guò)網(wǎng)絡(luò)文件系統(tǒng)來(lái)建立主機(jī)與目標(biāo)板之間的文件通信過(guò)程,之后的系統(tǒng)更新通常也是使用Boot Loader的這種工作模式。工作于這種模式下的Boot Loader通常都會(huì)向它的終端用戶(hù)提供一個(gè)簡(jiǎn)單的命令行接口。

2、磁盤(pán)啟動(dòng)方式

這種方式主要是用在臺(tái)式機(jī)和服務(wù)器上的,這些計(jì)算機(jī)都使用BIOS引導(dǎo),并且使用磁盤(pán)作為存儲(chǔ)介質(zhì),這里面兩個(gè)重要的用來(lái)啟動(dòng)linux的有LILO和GRUB,這里就不再具體說(shuō)明了。

3、flash啟動(dòng)方式

這是我們最常用的方式。Flash有NOR Flash和NAND Flash兩種。NOR Flash可以支持隨機(jī)訪問(wèn),所以代碼可以直接在Flash上執(zhí)行,Bootloader一般是存儲(chǔ)在Flash芯片上的。另外Flash上還存儲(chǔ)著參數(shù)、內(nèi)核映像和文件系統(tǒng)。這種啟動(dòng)方式與網(wǎng)絡(luò)啟動(dòng)方式之間的不同之處就在于,在網(wǎng)絡(luò)啟動(dòng)方式中,內(nèi)核映像和文件系統(tǒng)首先是放在主機(jī)上的,然后經(jīng)過(guò)網(wǎng)絡(luò)傳輸下載進(jìn)目標(biāo)板的,而這種啟動(dòng)方式中內(nèi)核映像和文件系統(tǒng)則直接是放在Flash中的,這兩點(diǎn)在我們u-boot的使用過(guò)程中都用到了。

U-boot的定義

U-boot,全稱(chēng)Universal Boot Loader,是由DENX小組的開(kāi)發(fā)的遵循GPL條款的開(kāi)放源碼項(xiàng)目,它的主要功能是完成硬件設(shè)備初始化、操作系統(tǒng)代碼搬運(yùn),并提供一個(gè)控制臺(tái)及一個(gè)指令集在操作系統(tǒng)運(yùn)行前操控硬件設(shè)備。U-boot之所以這么通用,原因是他具有很多特點(diǎn):開(kāi)放源代碼、支持多種嵌入式操作系統(tǒng)內(nèi)核、支持多種處理器系列、較高的穩(wěn)定性、高度靈活的功能設(shè)置、豐富的設(shè)備驅(qū)動(dòng)源碼以及較為豐富的開(kāi)發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持。另外u-boot對(duì)操作系統(tǒng)和產(chǎn)品研發(fā)提供了靈活豐富的支持,主要表現(xiàn)在:可以引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核,可以靈活設(shè)置/傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開(kāi)發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,支持多種文件系統(tǒng),支持多種目標(biāo)板環(huán)境參數(shù)存儲(chǔ)介質(zhì),采用CRC32校驗(yàn),可校驗(yàn)內(nèi)核及鏡像文件是否完好,提供多種控制臺(tái)接口,使用戶(hù)可以在不需要ICE的情況下通過(guò)串口/以太網(wǎng)/USB等接口下載數(shù)據(jù)并燒錄到存儲(chǔ)設(shè)備中去(這個(gè)功能在實(shí)際的產(chǎn)品中是很實(shí)用的,尤其是在軟件現(xiàn)場(chǎng)升級(jí)的時(shí)候),以及提供豐富的設(shè)備驅(qū)動(dòng)等。

u-boot源代碼的目錄結(jié)構(gòu)

1、board中存放于開(kāi)發(fā)板相關(guān)的配置文件,每一個(gè)開(kāi)發(fā)板都以子文件夾的形式出現(xiàn)。

2、Commom文件夾實(shí)現(xiàn)u-boot行下支持的命令,每一個(gè)命令對(duì)應(yīng)一個(gè)文件。

3、cpu中存放特定cpu架構(gòu)相關(guān)的目錄,每一款cpu架構(gòu)都對(duì)應(yīng)了一個(gè)子目錄。

4、Doc是文檔目錄,有u-boot非常完善的文檔。

5、Drivers中是u-boot支持的各種設(shè)備的驅(qū)動(dòng)程序。

6、Fs是支持的文件系統(tǒng),其中最常用的是JFFS2文件系統(tǒng)。

7、Include文件夾是u-boot使用的頭文件,還有各種硬件平臺(tái)支持的匯編文件,系統(tǒng)配置文件和文件系統(tǒng)支持的文件。

8、Net是與網(wǎng)絡(luò)協(xié)議相關(guān)的代碼,bootp協(xié)議、TFTP協(xié)議、NFS文件系統(tǒng)得實(shí)現(xiàn)。

9、Tooles是生成U-boot的工具。

對(duì)u-boot的目錄有了一些了解后,分析啟動(dòng)代碼的過(guò)程就方便多了,其中比較重要的目錄就是/board、/cpu、/drivers和/include目錄,如果想實(shí)現(xiàn)u-boot在一個(gè)平臺(tái)上的移植,就要對(duì)這些目錄進(jìn)行深入的分析。

u-boot的啟動(dòng)過(guò)程[!--empirenews.page--]

系統(tǒng)啟動(dòng)的入口點(diǎn)。既然我們現(xiàn)在要分析u-boot的啟動(dòng)過(guò)程,就必須先找到u-boot最先實(shí)現(xiàn)的是哪些代碼,最先完成的是哪些任務(wù)。另一方面一個(gè)可執(zhí)行的image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口點(diǎn),所以要通知編譯器這個(gè)入口在哪里。由此我們可以找到程序的入口點(diǎn)是在/board/lpc2210/u-boot.lds中指定的,其中ENTRY(_STart)說(shuō)明程序從_start開(kāi)始運(yùn)行,而他指向的是cpu/arm7tdmi/start.o文件。因?yàn)槲覀冇玫氖茿RM7TDMI的cpu架構(gòu),在復(fù)位后從地址0x00000000取它的第一條指令,所以我們將Flash映射到這個(gè)地址上,這樣在系統(tǒng)加電后,cpu將首先執(zhí)行u-boot程序。

u-boot的啟動(dòng)過(guò)程是多階段實(shí)現(xiàn)的,分了兩個(gè)階段。依賴(lài)于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1中,而且通常都是用匯編語(yǔ)言來(lái)實(shí)現(xiàn),以達(dá)到短小精悍的目的。而stage2則通常是用C語(yǔ)言來(lái)實(shí)現(xiàn)的,這樣可以實(shí)現(xiàn)復(fù)雜的功能,而且代碼具有更好的可讀性和可移植性。

下面我們先詳細(xì)分析下stage1中的代碼,如圖2所示:

 

 

圖2 Start.s程序流程

代碼真正開(kāi)始是在_start,設(shè)置異常向量表,這樣在cpu發(fā)生異常時(shí)就跳轉(zhuǎn)到/cpu/arm7tdmi/interrupts中去執(zhí)行相應(yīng)得中斷代碼。在interrupts文件中大部分的異常代碼都沒(méi)有實(shí)現(xiàn)具體的功能,只是打印一些異常消息,其中關(guān)鍵的是reset中斷代碼,跳到reset入口地址。

reset復(fù)位入口之前有一些段的聲明。在reset中,首先是將cpu設(shè)置為svc32模式下,并屏蔽所有irq和fiq。在u-boot中除了定時(shí)器使用了中斷外,其他的基本上都不需要使用中斷,比如串口通信和網(wǎng)絡(luò)等通信等,在u-boot中只要完成一些簡(jiǎn)單的通信就可以了,所以在這里屏蔽掉了所有的中斷響應(yīng)。

初始化外部總線(xiàn)。這部分首先設(shè)置了I/O口功能,包括串口、網(wǎng)絡(luò)接口等的設(shè)置,其他I/O口都設(shè)置為GPIO。然后設(shè)置BCFG0~BCFG3,即外部總線(xiàn)控制器。這里bank0對(duì)應(yīng)Flash,設(shè)置為16位寬度,總線(xiàn)速度設(shè)為最慢,以實(shí)現(xiàn)穩(wěn)定的操作;Bank1對(duì)應(yīng)DRAM,設(shè)置和Flash相同;Bank2對(duì)應(yīng)RTL8019。

接下來(lái)是cpu關(guān)鍵設(shè)置,包括系統(tǒng)重映射(告訴處理器在系統(tǒng)發(fā)生中斷的時(shí)候到外部存儲(chǔ)器中去讀取中斷向量表)和系統(tǒng)頻率。

lowlevel_init,設(shè)定RAM的時(shí)序,并將中斷控制器清零。這些部分和特定的平臺(tái)有關(guān),但大致的流程都是一樣的。

下面就是代碼的搬移階段了。為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來(lái)執(zhí)行,因此必須為加載Boot Loader的stage2準(zhǔn)備好一段可用的RAM空間范圍??臻g大小最好是memory page大小(通常是4KB)的倍數(shù),一般而言,1M的RAM空間已經(jīng)足夠了。flash中存儲(chǔ)的u-boot可執(zhí)行文件中,代碼段、數(shù)據(jù)段以及BSS段都是首尾相連存儲(chǔ)的,所以在計(jì)算搬移大小的時(shí)候就是利用了用BSS段的首地址減去代碼的首地址,這樣算出來(lái)的就是實(shí)際使用的空間。程序用一個(gè)循環(huán)將代碼搬移到0x81180000,即RAM底端1M空間用來(lái)存儲(chǔ)代碼。然后程序繼續(xù)將中斷向量表搬到RAM的頂端。由于stage2通常是C語(yǔ)言執(zhí)行代碼,所以還要建立堆棧去。在堆棧區(qū)之前還要將malloc分配的空間以及全局?jǐn)?shù)據(jù)所需的空間空下來(lái),他們的大小是由宏定義給出的,可以在相應(yīng)位置修改?;緝?nèi)存分布圖:

 

 

圖3 搬移后內(nèi)存分布情況圖

接下來(lái)是u-boot啟動(dòng)的第二個(gè)階段,是用c代碼寫(xiě)的,這部分是一些相對(duì)變化不大的部分,我們針對(duì)不同的板子改變它調(diào)用的一些初始化函數(shù),并且通過(guò)設(shè)置一些宏定義來(lái)改變初始化的流程,所以這些代碼在移植的過(guò)程中并不需要修改,也是錯(cuò)誤相對(duì)較少出現(xiàn)的文件。在文件的開(kāi)始先是定義了一個(gè)函數(shù)指針數(shù)組,通過(guò)這個(gè)數(shù)組,程序通過(guò)一個(gè)循環(huán)來(lái)按順序進(jìn)行常規(guī)的初始化,并在其后通過(guò)一些宏定義來(lái)初始化一些特定的設(shè)備。在最后程序進(jìn)入一個(gè)循環(huán),main_loop。這個(gè)循環(huán)接收用戶(hù)輸入的命令,以設(shè)置參數(shù)或者進(jìn)行啟動(dòng)引導(dǎo)。

本篇文章將分析重點(diǎn)放在了前面的start.s上,是因?yàn)檫@部分無(wú)論在移植還是在調(diào)試過(guò)程中都是最容易出問(wèn)題的地方,要解決問(wèn)題就需要程序員對(duì)代碼進(jìn)行修改,所以在這里簡(jiǎn)單介紹了一下start.s的基本流程,希望能對(duì)大家有所幫助。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶(hù)希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話(huà)語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉