国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

基于ARM-Linux嵌入式系統(tǒng)引導(dǎo)程序的設(shè)計(jì)

發(fā)布時(shí)間:2010-7-27 12:51    發(fā)布者:lavida
在專用的嵌入式開發(fā)板上運(yùn)行操作系統(tǒng)(如Linux)已經(jīng)變得越來越流行,而Bootloader就是為引導(dǎo)操作系統(tǒng)內(nèi)核運(yùn)行的一段代碼。通過它可以初始化硬件設(shè)備、建立或檢測內(nèi)存空間的映射,其功能有點(diǎn)類似于PC機(jī)的BIOS(基本輸入輸出系統(tǒng))程序。它的主要作用是為運(yùn)行操作系統(tǒng)提供基本的運(yùn)行環(huán)境,并操作系統(tǒng)的內(nèi)核裝載到存儲(chǔ)器(RAM)中的合適位置上去運(yùn)行。本文將以Samsung公司的S3C2410開發(fā)板為開發(fā)平臺(tái),具體闡述了Bootloader的運(yùn)行原理與實(shí)現(xiàn)分析。

Bootloader程序與CPU芯片的內(nèi)核結(jié)構(gòu)、具體芯片和使用的操作系統(tǒng)等因素有著密切關(guān)系,因此要為所有類型的嵌入式開發(fā)板建立一個(gè)通用的Bootloader幾乎是不可能的。盡管如此,本文將盡量對(duì)Bootloader歸納出一些通用的概念,以幫助特定用戶設(shè)計(jì)實(shí)現(xiàn)自己的Bootloader。

1.系統(tǒng)組成

典型的ARM嵌入式系統(tǒng)硬件平臺(tái)一般包括一個(gè)以ARM為內(nèi)核的處理器、存儲(chǔ)器和必要的外部接口與設(shè)備。在本系統(tǒng)中,采用內(nèi)嵌ARM920T的Samsung公司S3C2410處理器,工作頻率200MHz,存儲(chǔ)器使用2MB的NorFlash和64MB的SDRAM,外部接口除了用于下載和通信的串口,還配備有以太網(wǎng)接口、USB接口。

軟件平臺(tái)由以下部分組成:Bootloader、嵌入式操作系統(tǒng)內(nèi)核(Kernel)、文件系統(tǒng)(Filesystem)[1]。其中,嵌入式操作系統(tǒng)內(nèi)核是嵌入式系統(tǒng)加電運(yùn)行后的管理平臺(tái),負(fù)責(zé)實(shí)時(shí)性任務(wù)和多任務(wù)的管理。文件系統(tǒng)是嵌入式系統(tǒng)軟件平臺(tái)占用存儲(chǔ)量最大的一部分,也是與用戶開發(fā)最相關(guān)的一部分。它存儲(chǔ)了系統(tǒng)配置文件、系統(tǒng)程序、用戶應(yīng)用程序和必需的驅(qū)動(dòng)程序。

2、Bootloader運(yùn)行流程

系統(tǒng)加電或復(fù)位后,所有的CPU通常都從某個(gè)由CPU制造商預(yù)先安排的地址上取指令。比如SansungS3C2410CPU,在系統(tǒng)加電或復(fù)位時(shí)就會(huì)從地址0x00000000處讀取它的第一條指令。基于CPU構(gòu)建的嵌入式系統(tǒng)則通常都會(huì)有某種類型的固態(tài)存儲(chǔ)設(shè)備(如本例中的FLASH)被映射到這個(gè)預(yù)先安排的地址上,而Bootloader程序一般正是被燒錄或者下載到固態(tài)存儲(chǔ)設(shè)備的0x00000000地址處,因此在系統(tǒng)在加電或復(fù)位后,CPU將會(huì)首先執(zhí)行Bootloader程序。

由于Bootloader的實(shí)現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此Bootloader功能的實(shí)現(xiàn)基本可分為Stage1和Stage2兩大部分,分別運(yùn)行于系統(tǒng)的ROM和RAM中。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在Stage1中,基本都用匯編語言來實(shí)現(xiàn),以達(dá)到簡短精練的目的。而Stage2則通常用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會(huì)具有更好的可讀性和可移植性[3]。

3.1其中,Bootloader的Stage1通常依次執(zhí)行以下主要步驟:

3.1.1硬件設(shè)備初始化。

其目的是為執(zhí)行Stage2及隨后的操作系統(tǒng)Kernel準(zhǔn)備好一些基本的硬件環(huán)境。

(a)建立中斷向量表,當(dāng)程序出現(xiàn)異常后可跳轉(zhuǎn)到相應(yīng)子程序執(zhí)行。如

bResetAddr;
bUndefAddr;handlerforUndefinedmode0x4
bSWI_Addr;handlerforSWIinterrupt0x8
bPreAbortAddr;handlerforPreAbort0xC
bDataAbortAddr;handlerforDataAbort0x10
b.;reserved0x14
bIRQ_Addr;handlerforIRQinterrupt0x18
bFIQ_Addr;handlerforFIQinterrupt0x1C

(b)屏蔽所有的中斷。為中斷提供服務(wù)通常是操作系統(tǒng)設(shè)備驅(qū)動(dòng)程序的責(zé)任,因此在Bootloader的執(zhí)行全過程中可以不必響應(yīng)任何中斷。可以通過寫S3C2410的寄存器INTMSK、INTSUBMSK來完成;

(c)設(shè)置CPU的速度和時(shí)鐘頻率。可以通過寫寄存器LOCKTIME、MPLLCON、UPLLCON來實(shí)現(xiàn);

(d)RAM初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器BWSCON以及各內(nèi)存控制寄存器等。

(e)初始化LED。典型地,通過GPIO來驅(qū)動(dòng)LED,其目的是表明系統(tǒng)的狀態(tài)是正常還是出現(xiàn)錯(cuò)誤。

3.1.2為加載Stage2準(zhǔn)備RAM空間,拷貝Stage2到RAM中。

為了獲得更快的執(zhí)行速度,通常把Stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的Stage2準(zhǔn)備好一段可用的RAM空間范圍。具體的地址范圍可以任意安排,比如我們習(xí)慣將Stage2可執(zhí)行映像安排到RAM地址最頂部1MB開始的空間內(nèi)執(zhí)行。拷貝時(shí)要確定兩點(diǎn):Stage2的可執(zhí)行映像存放在Flash中的起始地址和終止地址;以及RAM空間的起始地址。

3.1.3設(shè)置堆棧指針sp。

堆棧指針的設(shè)置是為了執(zhí)行C語言代碼作好準(zhǔn)備,通常我們可以把sp(Userstack)設(shè)置在上面所安排的那個(gè)1MBRAM空間的最頂端(堆棧向下生長)。此外,在設(shè)置堆棧指針sp之前,也可以關(guān)閉LED燈,以提示我們準(zhǔn)備跳轉(zhuǎn)到Stage2。

3.1.4跳轉(zhuǎn)到Stage2的C入口點(diǎn)。

在上述一切都就緒后,就可以跳轉(zhuǎn)到Bootloader的Stage2去執(zhí)行了。比如通過修改PC寄存器為合適的地址來實(shí)現(xiàn)。

3.2Bootloader的Stage2通常依次執(zhí)行以下主要步驟:

3.2.1進(jìn)入Stage2的入口程序

Stage2的代碼通常用C語言來實(shí)現(xiàn),但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接bootloader這樣的程序時(shí),我們無法使用glibc庫中的任何支持函數(shù)。這就需要我們利用匯編語言寫一段trampoline(彈簧床)小程序,并將這段trampoline小程序來作為Stage2可執(zhí)行映象的執(zhí)行入口點(diǎn)。然后我們可以在trampoline小程序中用CPU跳轉(zhuǎn)指令跳入main()函數(shù)中去執(zhí)行;而當(dāng)main()函數(shù)返回時(shí),CPU執(zhí)行路徑顯然再次回到了trampoline程序。具體程序如下:

.text
.globl_trampoline
_trampoline:
blmain
b_trampoline

3.2.2初始化本階段要使用到的硬件設(shè)備

這通常包括:初始化至少一個(gè)串口,以便和終端用戶進(jìn)行I/O輸出信息;初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前,也可以重新把LED燈點(diǎn)亮,以表明我們已經(jīng)進(jìn)入main()函數(shù)執(zhí)行。設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號(hào)等。

3.2.3檢測系統(tǒng)的內(nèi)存映射(Memorymap)

所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的RAM單元。CPU通常預(yù)留出一段足夠大的地址空間給系統(tǒng)RAM,但是在搭建具體的嵌入式系統(tǒng)時(shí)不一定會(huì)實(shí)現(xiàn)CPU預(yù)留的全部RAM地址空間。而是往往只把CPU預(yù)留的全部RAM地址空間中的一部分映射到RAM單元上,而讓剩下的那部分預(yù)留RAM地址空間處于未使用狀態(tài)。如S3C2410使用的RAM空間僅為0x30000000-0x33ffffff。

3.2.4加載內(nèi)核映像和根文件系統(tǒng)映像并從Flash上拷貝

規(guī)劃內(nèi)存占用的布局。這里包括兩個(gè)方面:(1)內(nèi)核映像所占用的內(nèi)存范圍;(2)根文件系統(tǒng)所占用的內(nèi)存范圍。對(duì)于內(nèi)核映像,一般將其拷貝到從(MEM_START+0x8000)這個(gè)基地址開始的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式Linux的內(nèi)核一般都不超過1MB)。從MEM_START到MEM_START+0x8000這段32KB大小的內(nèi)存之所以被空出,是因?yàn)長inux內(nèi)核要在這段內(nèi)存中放置一些全局?jǐn)?shù)據(jù)結(jié)構(gòu),如:啟動(dòng)參數(shù)和內(nèi)核頁表等信息。而對(duì)于根文件系統(tǒng)映像,則一般將其拷貝到MEM_START+0x0010,0000開始的地方。若采用Ramdisk作為根文件系統(tǒng)映像,則其解壓后的大小一般為1MB。

由于像ARM這樣的嵌入式CPU通常都是在統(tǒng)一的內(nèi)存地址空間中尋址Flash等固態(tài)存儲(chǔ)設(shè)備,因此從Flash上讀取數(shù)據(jù)與從RAM單元中讀取數(shù)據(jù)并沒有什么不同。用一個(gè)簡單的循環(huán)就可以完成從Flash設(shè)備上拷貝映像的工作。如:

count=kernelsize
while(count>0){
*dest++=*src++;/*theyareallalignedwithwordboundary*/
count-=4;/*bytenumber*/
};

3.2.5設(shè)置內(nèi)核的啟動(dòng)參數(shù)

將內(nèi)核映像和根文件系統(tǒng)映像拷貝到RAM空間后,設(shè)置Linux內(nèi)核的啟動(dòng)參數(shù),如ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等,然后就可以準(zhǔn)備啟動(dòng)Linux內(nèi)核了。

3.2.6調(diào)用內(nèi)核。

Bootloader調(diào)用Linux內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到MEM_START+0x8000地址處。此時(shí),還需要設(shè)置CPU寄存器、CPU模式、Cache和MMU。

3.結(jié)束語

Bootloader是依賴于硬件而實(shí)現(xiàn)的,每個(gè)目標(biāo)板的硬件配置都不完全一樣,因此Bootloader程序也都不會(huì)完全一樣。本文以Samsung公司的的S3C2410開發(fā)板為平臺(tái),闡述了Bootloader運(yùn)行的主要步驟和關(guān)鍵技術(shù),為實(shí)現(xiàn)引導(dǎo)Linux操作系統(tǒng)內(nèi)核運(yùn)行提供合適的環(huán)境。文章后面關(guān)于Linux內(nèi)核啟動(dòng)參數(shù)的具體設(shè)置及如何調(diào)用內(nèi)核是和具體操作系統(tǒng)密切關(guān)系的,未做詳細(xì)論述。此外,設(shè)計(jì)與實(shí)現(xiàn)一個(gè)優(yōu)秀的Bootloader程序是一個(gè)龐大復(fù)雜的過程,在程序中如能多利用LED和串口輸出信息會(huì)是幫助我們調(diào)試的好方法。
本文地址:http://www.qingdxww.cn/thread-17307-1-1.html     【打印本頁】

本站部分文章為轉(zhuǎn)載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé);文章版權(quán)歸原作者及原出處所有,如涉及作品內(nèi)容、版權(quán)和其它問題,我們將根據(jù)著作權(quán)人的要求,第一時(shí)間更正或刪除。
您需要登錄后才可以發(fā)表評(píng)論 登錄 | 立即注冊(cè)

廠商推薦

  • Microchip視頻專區(qū)
  • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
  • Dev Tool Bits——使用條件軟件斷點(diǎn)宏來節(jié)省時(shí)間和空間
  • Dev Tool Bits——使用DVRT協(xié)議查看項(xiàng)目中的數(shù)據(jù)
  • Dev Tool Bits——使用MPLAB® Data Visualizer進(jìn)行功率監(jiān)視
  • 貿(mào)澤電子(Mouser)專區(qū)

相關(guān)視頻

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲日本aⅴ片在线观看香蕉 | 伊人小婷婷色香综合缴缴情 | 色婷婷影院在线视频免费播放 | 日韩免费 | 啪免费视频 | 91免费看片| 色视频免费在线观看 | 午夜黄色毛片 | 色噜噜国产精品视频一区二区 | 亚洲欧美日韩激情在线观看 | 精品国产一区二区三区www | 成人三级在线播放线观看 | 久久这里只精品热免费99 | 国产资源在线看 | 黄到女生下面湿的文章 | 日韩成人一级 | 欧美日韩国产一区二区三区不卡 | 无限资源日本好片 | 久久精品国产四虎 | 欧美性一级| 国产在线精品一区二区高清不卡 | 2019天堂网 | 欧美操美女 | 91免费精品视频 | 网友自拍区一区二区三区 | 丰满的锼子4中文字日本 | 国产日韩欧美一区二区 | 亚洲一级视频在线观看 | 日本高清视频一区二区三区 | 成人午夜视频免费观看 | 国产欧美精品专区一区二区 | 日韩欧美在线观看一区 | 九九免费精品视频在这里 | 日日舔夜夜摸 | 免费国产黄网站在线观看 | 日本视频在线观看不卡高清免费 | 久久久久久久国产高清 | 韩国黄色毛片 | 成人a站| 亚洲激情视频在线 | 四虎永久免费网站免费观看 |