當(dāng)前位置:首頁(yè) > 物聯(lián)網(wǎng) > 《物聯(lián)網(wǎng)技術(shù)》雜志
[導(dǎo)讀]摘 要:?jiǎn)?dòng)裝載程序是嵌入式系統(tǒng)的重要組成部分。文章結(jié)合在ARM平臺(tái)上廣泛使用的U-Boot,詳細(xì)討論了Boot Loader開(kāi)發(fā)中用到的主要技術(shù),分析引導(dǎo)程序的執(zhí)行流程,提出了WinCE和Linux在ARM平臺(tái)下啟動(dòng)的實(shí)現(xiàn)原理和方法。

引 言

隨著計(jì)算機(jī)技術(shù)、微電子技術(shù)、現(xiàn)代制造工藝和設(shè)計(jì)能力的不斷進(jìn)步和發(fā)展,硬件的集成度越來(lái)越高,使嵌入式系統(tǒng)在生產(chǎn)、生活中被廣泛采用。但隨之而來(lái)的是用戶需求也越來(lái)越高,為了充分發(fā)揮嵌入式設(shè)備的性能,需要一個(gè)強(qiáng)大的操作系統(tǒng),而在操作系統(tǒng)運(yùn)行之前需要一段程序完成基本的初始化操作進(jìn)而啟動(dòng)操作系統(tǒng),Boot Loader 就是這段程序。此舉實(shí)現(xiàn)了系統(tǒng)從硬件啟動(dòng)到操作系統(tǒng)啟動(dòng)的過(guò)渡,它固化在硬件中,被認(rèn)為是嵌入式系統(tǒng)不可缺少的一部分,其作用類似于 PC上的 BIOS 和GRUB。但當(dāng)前嵌入式設(shè)備上實(shí)現(xiàn)的Boot Loader 大多只支持一個(gè)操作系統(tǒng)的引導(dǎo),大大限制了嵌入式設(shè)備的使用。

本文結(jié)合在 ARM 平臺(tái)上廣泛使用的 U-Boot,詳細(xì)討論了嵌入式 Boot Loader 的整體架構(gòu)和運(yùn)行流程。闡述了系統(tǒng)主要硬件的原理和裸機(jī)驅(qū)動(dòng)程序設(shè)計(jì),包含系統(tǒng)時(shí)鐘設(shè)置, CPU 模式設(shè)置,內(nèi)存初始化,NAND FLASH 配置和操作方法, WinCE 和嵌入式 Linux 在 ARM 平臺(tái)下啟動(dòng)的實(shí)現(xiàn)原理和方法。最終實(shí)現(xiàn)了在 ARM 平臺(tái)上的雙啟動(dòng) Boot Loader。

1 系統(tǒng)的硬件平臺(tái)

本文使用的開(kāi)發(fā)平臺(tái)為友善之臂 Mini6410 開(kāi)發(fā)板, 使用 Samsung 公司設(shè)計(jì)生產(chǎn)的 S3C6410 處理器, 使用 2 片K4X1G163PC 構(gòu)成 256 M SDRAM,將 K9GAG08U0E 作為永久存儲(chǔ)器。

1.1 CPU

S3C6410 基于ARM1176JZF-S 內(nèi)核 [1-2], 包括分立的16kB指令和 16kB數(shù)據(jù) Cache,16kB指令和數(shù)據(jù) TCM,及1個(gè)完全的 MMU,用以處理虛擬存儲(chǔ)管理。S3C6410內(nèi)部有3 個(gè) PLL,分別是 APLL,MPLL 和EPLL。APLL 用于 ARM 時(shí)鐘操作,MPLL 用于主時(shí)鐘操作,EPLL 用于特殊用途。時(shí)鐘操作被分為三組 :APLL 產(chǎn)生ARM 時(shí)鐘 ;MPLL 產(chǎn)生主系統(tǒng)時(shí)鐘,用于操作 AXI,AHB 和 APB 總線 ;EPLL 產(chǎn)生的時(shí)鐘主要用于外設(shè) IPS,對(duì) CPU 的設(shè)置主要采用 CPU 模式、中斷和時(shí)鐘設(shè)置,Boot Loader 和操作系統(tǒng)運(yùn)行在 SVC 模式, 在U-Boot 中無(wú)需中斷,時(shí)鐘的選擇根據(jù)應(yīng)用環(huán)境而定。

1.2 內(nèi)存

本系統(tǒng)選用兩片 64 M×16 bit 的Mobile DDR 芯片,連接到S3C6410 SRAM 控制器,工作頻率為 133 MHz,在處理器內(nèi)部時(shí)鐘為 533 MHz 時(shí),能夠接近最高使用效率。內(nèi)存的初始化主要是對(duì) SRAM 控制器的初始化,具體的初始化步驟在S3C6410 手冊(cè)上有詳細(xì)說(shuō)明 [3]。具體流程如下:

(1) 使 SRAM控制器進(jìn)入配置模式;

(2) 填寫(xiě)內(nèi)存芯片的時(shí)序參數(shù),并開(kāi)始內(nèi)存芯片的初始化序列 ;

(3) 配置完成后檢查狀態(tài)標(biāo)志位。

1.3 NANDFLASH

NANDFLASH作為嵌入式系統(tǒng)中廣泛使用的永久性存儲(chǔ)器 [4],具有容量大、改寫(xiě)速度快等優(yōu)點(diǎn),適用于大量數(shù)據(jù)的存儲(chǔ),但是由于 NANDFLASH的設(shè)計(jì)原理,在操作時(shí)有自己獨(dú)特的要求 :只能以頁(yè)為單位讀寫(xiě),而且寫(xiě)時(shí)只能將 1寫(xiě)為 0。所以在寫(xiě)入前必須以塊為單位擦除。

S3C6410內(nèi)部包含一個(gè) NANDFLASH控制器,用戶只需配置好 NANDFLASH 的時(shí)序參數(shù),NANDFLASH 控制器即可自動(dòng)產(chǎn)生所需時(shí)序 [5]。主要配置的時(shí)序?yàn)?CLE/ALE拉高到 nWE拉低的等待時(shí)間,nWE為低的持續(xù)時(shí)間,nWE拉高后 CLE/ALE繼續(xù)保持為高的時(shí)間。

1.4 存儲(chǔ)器規(guī)劃與分配

將 NAND FLASH 分為如下區(qū)域 :Boot Loader,Linux_ kernel,Linux_rootfs,WinCE 等。 通過(guò)外部跳線,NAND FLASH 啟動(dòng)后,S3C6410 將自動(dòng)加載前 8 k 內(nèi)容到 S3C6410 的內(nèi)部 SRAM(Steppingstone)并開(kāi)始從地址 0 處運(yùn)行,最終加載并引導(dǎo)操作系統(tǒng),如圖 1(a)所示。

引導(dǎo)操作系統(tǒng)時(shí)需要用戶在控制臺(tái)中輸入命令選擇啟動(dòng)的操作系統(tǒng),系統(tǒng)將加載制定 NAND FLASH 中的內(nèi)容到內(nèi)存指定位置,圖 1(b)為物理內(nèi)存使用規(guī)劃,該配置內(nèi)容將保存在開(kāi)發(fā)板配置文件 $(board).h 中。

基于U-Boot的嵌入式系統(tǒng)雙啟動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

2 U-Boot分析

U-Boot(Universal Boot Loader)是遵循 GPL 協(xié)議的開(kāi)放源碼項(xiàng)目。具有系統(tǒng)引導(dǎo)、上電自檢、CRC32 校驗(yàn)、設(shè)備驅(qū)動(dòng)、支持 NFS 掛載、支持多種方式存儲(chǔ)等功能。在嵌入式領(lǐng)域被廣泛使用。

U-Boot 屬于兩階段啟動(dòng)的Boot Loader,在第一階段由匯編語(yǔ)言完成,與處理器直接相關(guān),完成 CPU 模式切換,禁止看門狗,初始化內(nèi)存控制器,設(shè)置堆棧,重定位 U-Boot 運(yùn)行位置等操作,最后跳轉(zhuǎn)到第二階段代碼運(yùn)行。第二階段代碼主要由 C 語(yǔ)言完成,與目標(biāo)板相關(guān),主要完成所有設(shè)備的初始化工作,最后加載并啟動(dòng)操作系統(tǒng),具體流程如圖 2 所示。

基于U-Boot的嵌入式系統(tǒng)雙啟動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

U-Boot 目標(biāo)文件通過(guò) <$(board)/u-boot.lds> 鏈接腳本控制,該文件定義了連接到目標(biāo)文件中各段的名稱和位置,從該文件可以看出,U-Boot 由 <$(CPU)/start.o> 文件開(kāi)始, start.o由start.S 編譯生成,包含了U-Boot 第一階段的主要代碼。第二階段代碼以<$(arch)/board.c> 為入口。

U-Boot 支持多種平臺(tái),其驅(qū)動(dòng)程序代碼位于 drivers 文件夾下,各設(shè)備的板級(jí)配置信息由 <include/configs/$(board).h> 文件控制,是移植過(guò)程中需要修改的主要文件。

為提高軟件的復(fù)用性,系統(tǒng)將操作系統(tǒng)的引導(dǎo)函數(shù)作為獨(dú)立的U-Boot 命令添加到 U-Boot 中,支持多種命令,其命令的實(shí)現(xiàn)代碼保存在 Common 中,以“cmd_”作為文件前綴, 添加 U_Boot 命令時(shí)需使用 U-Boot 提供的 U_BOOT_CMD 宏聲明。

U_BOOT_CMD 各參數(shù)的意義 :

(1) Name:命令的名稱,用于唯一區(qū)別命令,在 U-Boot中如果命令的前綴不同,在終端可以直接輸入前綴執(zhí)行命令。

(2) Maxages:命令可以接收的最多的參數(shù)個(gè)數(shù)。

(3) Cmd:命令的實(shí)現(xiàn)函數(shù),命令被執(zhí)行時(shí),該函數(shù)被調(diào)用。

(4) Uasege:短的幫助信息,使用 help時(shí)將打印該信息。

(5) Help:長(zhǎng)的幫助信息,使用 helpCmd時(shí)打印該信息。在添加完代碼后,還需在 <Common/Makefile> 文件中添加相應(yīng)命令的目標(biāo)文件。

3 U-Boot雙系統(tǒng)驅(qū)動(dòng)啟動(dòng)的實(shí)現(xiàn)

U-Boot 要啟動(dòng)操作系統(tǒng),必須首先完成必要硬件的初始化,設(shè)置好操作系統(tǒng)的運(yùn)行環(huán)境后加載并啟動(dòng)操作系統(tǒng)。

3.1 硬件初始化代碼修改和配置

Mini6410 使用三星公司設(shè)計(jì)生產(chǎn)的基于 ARM1176JZF-S 內(nèi)核的S3C6410 處理器 [6]。為提高代碼復(fù)用度,減小移植難度,選用三星公司修改的 U-Boot1.1.6 版本,該版本支持與本開(kāi)發(fā)板類似的 SMDK6410,適當(dāng)修改后可以應(yīng)用在本開(kāi)發(fā)板上,可實(shí)現(xiàn)項(xiàng)目的主要功能。

修改 /Makefile :添加 mini6410 的編譯命令 :

-CROSS_COMPILE= /usr/local/arm/4.2.2-eabi/usr/bin/arm- linux-

+ CROSS_COMPILE = arm-linux-

+ mini6410_nand_config :unconfig

+@$(MKCONFIG)mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256

復(fù)制參考板代碼 :

board/samsung/smdk6410-> board/samsung/mini6410 include/configs/smdk6410.h-> include/config/mini6410.h

修改平臺(tái)相關(guān)代碼 :

Include/configs/Mini6410.h

Mini6410.h 包含了所有 Mini6410 開(kāi)發(fā)板的配置選項(xiàng),如SDRAM 的大小、位置,NAND FLASH 的大小,串口的配置, 網(wǎng)卡的型號(hào),MAC 地址,IP 地址等信息,以及默認(rèn)的內(nèi)核啟動(dòng)參數(shù)等。

(2) CPU/s3c64xx/Start.s

Start.s 是整個(gè)U-Boot 的入口,包含了最基本的設(shè)置 CPU 模式的代碼,可調(diào)用內(nèi)存初始化函數(shù)、系統(tǒng)時(shí)鐘初始化函數(shù)、第二階段入口函數(shù)。本文件主要修改的內(nèi)容是去掉 SMDK6410 中包含的 ONENAND 初始化代碼。

(3) Board/Samsung/Mini6410/Mini6410.c

Mini6410.c 包含了一些板級(jí)初始化代碼,包含網(wǎng)卡初始化函數(shù)的調(diào)用、LCD 初始化函數(shù)調(diào)用代碼等,以及虛擬內(nèi)存地址到物理內(nèi)存地址的轉(zhuǎn)換函數(shù)。本文件主要修改的內(nèi)容是去掉 SMDK6410 中包含的 CS8900 網(wǎng)卡的初始化函數(shù),添加了DM9000 的初始化函數(shù)和 USB 下載功能的支持函數(shù)。

(4) Common/Main.c

Main.c 包含了 U-Boot 接收并執(zhí)行命令的主循環(huán)函數(shù)man_loop(),本文件的代碼與體系無(wú)關(guān),不用做其他修改。但為了提高 U-Boot 的可用性添加了菜單函數(shù)。

3.2 引導(dǎo)WinCE系統(tǒng)

Boot Loader 引導(dǎo) WinCE 需要完成以下操作 :

設(shè)置 CPU為SVC模式。

完成 CPU,內(nèi)存控制器,系統(tǒng)時(shí)鐘,串口,Caches,TLBs的初始化。

解壓 WinCE內(nèi)核鏡像文件頭,檢查校驗(yàn)和,加載內(nèi)核到指定位置。

跳轉(zhuǎn)之前禁用中斷和 MMU。

解壓文件頭需要分析 WinCE 文件頭格式[7],WinCE 鏡像存在兩種格式,分別為 nb0 和 bin。nb0 是原始的二進(jìn)制鏡像,可以直接燒到 FLASH/ROM 中,它不包括頭,可以直接跳轉(zhuǎn)到其入口執(zhí)行,一般情況下采用 nb0 將內(nèi)核下載到設(shè)備的RAM 中運(yùn)行。bin 是一種二進(jìn)制鏡像格式,以片斷為單位組織數(shù)據(jù),每個(gè)片斷都包括一個(gè)頭,頭中指定有起始地址、長(zhǎng)度、校驗(yàn)值。Platform Builder 將 WinCE 內(nèi)核所有文件以 bin 格式合并成一個(gè)文件,默認(rèn)文件名為 nk.bin。Boot Loader 需要將nk.bin 分解成多個(gè)文件放到 RAM 中。

啟動(dòng) WinCE 操作系統(tǒng)只需要完成必要的硬件初始化,設(shè)置好 WinCE 系統(tǒng)的運(yùn)行環(huán)境,然后讀取并校驗(yàn) WinCE 鏡像文件,由鏡像文件頭部獲取 WinCE 的加載地址,并將 WinCE 保存到指定的位置后,跳轉(zhuǎn)到其開(kāi)始地址,就可以成功引導(dǎo)WinCE 操作系統(tǒng),如圖 3 所示。

3.3 引導(dǎo) Linux系統(tǒng)

Boot Loader 引導(dǎo) Linux 內(nèi)核需要完成以下操作 :

(1) 設(shè)置 CPU為SVC模式。

(2) 完成 CPU,內(nèi)存控制器,系統(tǒng)時(shí)鐘,串口,Caches,TLBs的初始化。

(3) 加載 Linux內(nèi)核鏡像文件到內(nèi)存指定位置。

(4) 設(shè)置Linux內(nèi)核啟動(dòng)參數(shù)并跳轉(zhuǎn)到內(nèi)核。

基于U-Boot的嵌入式系統(tǒng)雙啟動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

圖 3 啟動(dòng) WinCE

通過(guò)Boot Loader 啟動(dòng)內(nèi)核要傳遞三個(gè)參數(shù) :將第一個(gè)參數(shù)放在寄存器 0 中,一般 r0=0;第二個(gè)參數(shù)放在寄存器 1 中,是機(jī)器類型 ID ;第三個(gè)參數(shù)放在寄存器 2 中,是啟動(dòng)參數(shù)標(biāo)記列表(TaggedList)在 RAM 中的起始基地址。

其中機(jī)器ID 定義在<linux/arc/arm/tool/mach_types> 文件, 內(nèi)核用機(jī)器 ID 檢查是否支持當(dāng)前平臺(tái);TaggedList 是Boot Loader 傳遞給內(nèi)核的主要參數(shù),包含系統(tǒng)的根設(shè)備標(biāo)志,頁(yè)面大小,內(nèi)存的起始地址和大小,RAMDISK 的起始地址和大小,壓縮的 RAMDISK 根文件系統(tǒng)的起始地址和大小,內(nèi)核命令參數(shù)等。內(nèi)核參數(shù)鏈表的格式和說(shuō)明可以從內(nèi)核源代碼目錄樹(shù)的 <include/asm-arm/setup.h> 中找到, 參數(shù)鏈表必須以 ATAG_CORE 開(kāi)始,以 ATAG_NONE 結(jié)束。這里的 ATAG_CORE,ATAG_NONE 是各參數(shù)的標(biāo)記,是一個(gè)32 位值,例如:ATAG_CORE=0x54410001。其他參數(shù)標(biāo)記還包括 ATAG_MEM32,ATAG_INITRD,ATAG_RAMDISK,ATAG_COMDLINE 等。每個(gè)參數(shù)標(biāo)記就代表一個(gè)參數(shù)結(jié)構(gòu)體,由各參數(shù)結(jié)構(gòu)體構(gòu)成參數(shù)列表。內(nèi)核在啟動(dòng)時(shí)將解析該參數(shù)表,用于內(nèi)核啟動(dòng)的配置。

Linux 內(nèi)核的引導(dǎo)只需要完成必要的硬件初始化操作, 設(shè)置運(yùn)行環(huán)境后,讀取 Linux 內(nèi)核到預(yù)先規(guī)劃好的位置 ;設(shè)置好TaggedList 后,將TaggedList,MachID,內(nèi)存參數(shù),文件系統(tǒng)位置等信息傳遞給Linux 內(nèi)核后就能完成 Linux 內(nèi)核的引導(dǎo),如圖 4 所示。

基于U-Boot的嵌入式系統(tǒng)雙啟動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

圖 4 啟動(dòng) Linux

4 結(jié) 語(yǔ)

本文以三星 S3C6410 為處理器的 Mini6410 開(kāi)發(fā)板為硬件平臺(tái),以 U-Boot 為基礎(chǔ),實(shí)現(xiàn)了在一個(gè)嵌入式設(shè)備上使用一個(gè) Boot Loader 引導(dǎo)多個(gè)操作系統(tǒng)的目的。本文將系統(tǒng)啟動(dòng)的代碼實(shí)現(xiàn)為一個(gè)獨(dú)立的函數(shù),有利于降低項(xiàng)目代碼的耦合性,方便后續(xù)嵌入式系統(tǒng)的開(kāi)發(fā)。


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

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

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

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

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

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(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ā)表演講稱,數(shù)字世界的話語(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)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

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