999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

ARM-Linux嵌入式系統的Boot Loader分析與設計

2010-04-12 00:00:00王世陽,余學才,梁錫寧,陳濤,朱良銷,蘇
現代電子技術 2010年22期

摘 要:Boot Loader 作為 ARM 嵌入式系統的一個重要部分。對于使用不相同版本的內核的系統板,所對應的Boot Loader 也是相同,因此對每個系統板都要對其運行其所對應的Boot Loader。在此簡要介紹 S3C2410 及其兩種啟動方式,著重分析S3C2410 從 NANDFLASH 啟動的過程中,對各個內部功能模塊進行初始化過程,并設計出基于 S3C2410 嵌入式系統的Boot Loader。通過在線仿真及實際測試表明,該Boot Loader 具有良好的穩定性、實時性和可移植性。關鍵詞:ARM; Boot Loader; 嵌入式系統; 啟動方式

中圖分類號:TN911-34; TP311 文獻標識碼:A

文章編號:1004-373X(2010)22-0071-03

Analysis and Design of Boot Loader Based on ARM-Linux Embedded System

WANG Shi-yang, YU Xue-cai, LIANG Xi-ning, CHEN Tao, ZHU Liang-xiao, SU Ke

(SOEI, University of Electronic Science Technology of China, Chengdu 610054, China)

Abstract: Boot Loader is an important part of ARM embedded system. For different kernel system board, its Boot Loader is also different. Each bare-board should program its own Boot Loader. Therefore, the development of specific Boot Loader is particularly important, because the superiority of Boo Lloader directly affects on the performance of embedded systems. The S3C2410 and its two start-up modes are introduced. The process of initialization that S3C2410 makes for each internal module is analyzed emphatically during the start-up of NANDFLASH. A Boot Loader based on S3C2410 embedded system is designed. The online simulation and practical tests show that the Boot Loader has good stability, real-time performance and portability.

Keywords: ARM; Boot Loader; embedded system; start-up mode

0 引 言

由Boot Loader和固化在固件(firmware)中的Boot代碼(可選)共同組成一個嵌入式系統的引導加載程序。它的作用和功能就像固化到計算機內主板上的一個ROM芯片程序BIOS(basic input outputsystem)。但是它一般不配置像BIOS那樣的固件程序,這是因為要考慮經濟方面的原因,因此必須自己完成這方面的工作。Boot Loader可以初始化硬件設備,建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便為最終調用操作系統內核準備好正確的環境。它的實現嚴重地依賴于硬件,特別是在嵌入式系統中,即使基于同一個CPU的Boot Loader,對于不同的板子,也有很大的不同[1]。

1 Boot Loader分析

系統加電,然后復位后,基本上所有的CPU都是從復位地址上取得指令的。以微處理器為核心的嵌入式系統中,通常都有某種類型的固態存儲設備(FLASH,E2PROM等),這個固態存儲設備被映射到一個預先設置好的地址上。在系統加電復位后,一開始處理器就會去執行存放在復位地址處的程序,而且通過開發環境可以將 Boot Loader 定位在復位地址一開始的存儲空間上,因此 Boot Loader 是系統加電后,在操作系統內核或者一些應用程序被運行之前,首先會運行的程序。對于嵌入式系統來說,比較復雜的或者為了方便后期開發大的應用程序,有的使用操作系統,也有很多的情況下,因功能簡單,或僅包括應用程序的系統不使用操作系統,但是不論有無操作系統在啟動時都必須執行Boot Loader,為的是準備好軟硬件運行環境。

以微處理器為核心的嵌入式系統中,一般都有某種類型的固態存儲設備(FLASH,E2PROM等),這個固態存儲設備被映射到一個預先設置好的地址上。在系統加電復位后,一開始處理器就會去執行存放在復位地址處的程序。而且通過開發環境可以將 Boot Loader 定位在復位地址一開始的存儲空間上,因此 Boot Loader 是系統加電后,在操作系統內核或者一些應用程序被運行之前,首先會運行的程序。對于Linux系統,它的主要任務有以下7個方面。

(1) 初始化處理器及外設的硬件資源配置。一般嵌入式系統的處理器在上電復位后,外部的I/O引腳都處于輸入狀態,處理器的片內和片外設備資源都需要配置。

(2) 建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的環境,這樣就能為最終啟動操作系統的內核提供最好條件。

(3) 把操作裝載到映射的內存中,這也是所有任務當中最重要的一個,只有完成這個任務,操作系統才能被裝載到內存當中去,Boot Loader一般會提供串口和網絡裝載兩種方式。

(4) 為了把操作系統的映像保存在FLASH中,以便以后啟動,可以直接裝載FLASH的數據,而不用重新下載程序,但需要對FLASH進行編程。

(5) 運行操作系統。設置相關的寄存器和資源,跳轉到操作系統的所在空間,進行相關的引導,這就是Boot Loader。

(6) 在Linux系統啟動時,傳遞系統的啟動參數,可以給內核傳遞命令行等參數,通過命令行可以選擇控制系統的啟動模式。

(7) 命令行的解析和輸入/輸出控制。為了開發的方便,多數的Boot Loader都采用串口作為終端的控制方式[2]。

Boot Loader的啟動過程可分為兩個重要階段。第一階段:由于 Boot Loader的實現依賴于 CPU的體系結構,所以設備代碼的初始化等功能都在該階段完成。而且,為了達到縮短代碼的目的,通常用匯編語言來編寫。在這一階段的執行過程中,又可分為幾個方面。

① 硬件設備的初始化。

在該階段的執行過程中,首先需要對硬件設備進行初始化,其目的主要是為第二階段的執行以及隨后Kernel的調用準備基本的硬件環境。

② 為加載 Boot Loader的第二階段準備RAM空間。

為了獲得更快的執行速度,通常把第二階段加載到 RAM 空 間 中 來 執 行。因 此, 必 須 為 加 載Boot Loader準備好一段可用的 RAM空間范圍。

③ 設置堆棧指針。設置堆棧是為了執行 C語言代碼作好準備。

④ 跳轉到第二階段的C入口點。當程序執行到這個位置時,可以通過修改 PC寄存器的值,使其跳轉到第二階段。

第二階段階段的啟動流程分析:為了便于實現復雜的功能和獲得更好的代碼可讀性和可移植性,通常第二階段的代碼用C語言來實現。但是,與普通 C語言的不同之處是,這里使用了“ 彈簧床 ” 的概念,即先用匯編語言寫一段小程序,并將這段小程序作為第二階段可執行映像的執行入口點,然后在匯編程序中用 CPU跳轉指令跳入main ( )函數中去執行,當 main ( )函數返回時,CPU執行路徑再次返回到匯編程序中第二階段,包括初始化本階段要使用的硬件設備,檢測系統內存映射,會將Kernel映像和根文件系統映像從FLASH中讀到RAM空間中,為內核設置啟動參數調用內核。

2 Boot Loader的設計

2.1 中斷向量表(二級)的設計與建立

如果有中斷或者異常發生時,處理器便會強制性地把PC指針指向向量表中它所對應的中斷類型地址值。為了提高中斷響應速度,FLASH的0x0地址存放能跳轉到 0x33FFFF00地址處中斷向量的跳轉指令,也就是會在在RAM中建立一個二級中斷向量表,起始地址為0x33FFFF00。除了復位外,所有的異常入口地址都由FLASH跳轉得到,代碼如下:

#define _ISR_STARTADDRESS (SDRAM_END- 0x100) //0x33FFFF00

definepISR_RESET (* (unsigned *)(_ISR_STARTADDRESS+0x0))// x33FFFF00

#define pISR_UNDEF (* (unsigned *)(_ISR_STARTAD-DRESS+0x4))// x33FFFF04

2.2 第二階段拷貝到 RAM

把第二階段Stage2拷貝到 RAM地址的最頂大小為1 MB的開始空間, RAM的起始地址為0x30000000。代碼如下所示[3]:

/* 計算在FLASH中的位置, 假設該映像不超過64K,可修改該值*/

Adr r0,_start

Add r2,r0,#(64*1024)

Add r0,ro,#0x1000

Ldr r1,BLOB_START

/* 開始復制stage2 到 RAM,R0=源起始地址,R1=目的地址,R2源結束地址 */

copy_loop:

ldmia r0!,{r3- r10}

stmia r1!,{r3- r10}

cmp r0,r2

ble copy_loop

ldr r0,BLOB_START

2.3 堆棧指針的設置

用戶使用哪些中斷決定了系統堆棧的初始化, 以及系統需要處理的哪些錯誤類型。一般情況下,堆棧設置是必須, 而且是由管理者自己設置的。如果需要使用IRQ中斷, 那么IRQ堆棧的設置也是必須的,下面是IRQ堆棧的設置[4]:

IRQMode //堆棧

orr r1,r0,#IRQMODE|NOINT

msr cpsr_cxsf,r1; IRQMode

ldr sp,IRQStack

3 Stage2的設計

3.1 可執行映像 Stage2 的入口

由于Glibc 庫支持的函數不能用于編譯和鏈接 Boot Loader 這樣用C語言編寫的程序,因此把main()函數的起始地址作為第二階段的入口點是最直接的想法。可以用匯編編寫一段Trampoline小程序,用 CPU跳轉指令跳到main()函數去執行,當函數返回時會再次回到Trampoline 程序[5],代碼如下:

ldr sp DW_STACK_START @setup stack pointer

mov fp,#0 @no previous frame,so fp=0

mov a2, #0 @set argv to NULL

bl main @call main

mov pc,#FLASH_BASE @otherwise,reboot

程序順利時就不會再回到開始的Trampoline 程序,不然就會回到最后的語句,系統就會重新啟動。

3.2 內存影射

一般S3C2410上配置的SDRSAM大小為64 MB, 該SDRAM的物理地址范圍是0x30000000~0x33FFFFFF(屬于Bank 6)。由Section的大小可知,該物理空間可被分成64個物理段。因為ARM體系結構中數據緩沖必須通過 MMU開啟,因此Boot Loader效率不是很高,但是MMU可以通過平板映射(虛擬地址和物理地址相同)方式被開啟,這樣使用內存空間Dcache,從而使Boot Loader的運行速度得到有效的提高[6]。映射關系代碼如下[7-8]:

void mem_mapping_linear(void)

{ unsigned long descriptor_index, section_base, sdram_base,

sdram_size;

sdram_base=0x30000000;

sdram_size=0x4000000;

for (section_base =sdram_base,descriptor_index =

sec-tion_base>>20;Ssection_base

sdram_size; rdescrip-tor_index+=1;section_base +=0x100000)

{* (mmu_tlb_base +(descriptor_index)) =(section_base >>20) |

MMU_OTHER_SECDESC;}

}

3.3 裝載內核映像和根文件系統映像

像 ARM這樣的嵌入式 CPU 通常都是在統一的內存地址空間中尋址FLASH等固態存儲設備的,因此從 Flash 上讀取數據與從 RAM單元中讀取數據一樣,用一個簡單的循環就可以完成從FLASH設備上拷貝映像的工作:其中 count 為根文件系統映像的大小或內核映像的大小[9]。

While(count)

{ *dest++=*src++;//src為FLASH中的地址, dest為 RAM中的地址

count-=4;

}

3.4 內核的啟動參數的設置

內核啟動可以從 NAND FLASH(NOR FLASH)中啟動運行Linux,需要修改啟動命令如下[10]:

#ifdef CONFIG_S3C2410_NAND_BOOTChar Linux_

cmd[]=“ noinit root=/dev/bon/2 init=/Linuxrc console=

tty0 console=ttys0” ;

#else

CharLinux_cmd[]=“CharLinux_cmd[]=” noinit root=

/dev/bon/3init =/Linuxrc console=tty0 console=ttys0” ;

LCD啟動參數一般都包括root,init和console。noinitrd不使用ramdisk。root根文件系統在MTD分區。Init 內核運行入口命令文件。consol內核信息控制臺,ttys0表示串行口0[11];tty0表示虛擬終端。

4 結 語

通過對Boot Loader的分析可以看出,設計一個性能優良的 Boot Loader 可以提高系統的穩定性及實時性,它是嵌入式開發中不可或缺的一部分。只有設計出一個穩定的Boot Loader,才能進行下一步的系統開發工作,直至完成整個嵌入式系統的開發。設計Boot Loader是一項很復雜的工作,需要對硬件資源和所用的操作系統有很深的理解。在實際開發中可以根據需要簡化設計,去除不必要的系統功能,這樣可以大大提高程序執行的效率和穩定性。這里給出的 Boot Loader 已經順利通過了調試,可以正常加載操作系統。

參考文獻

[1]馬忠梅.ARM嵌入式處理器結構與應用基礎 [M].北京:北京航空航天大學出版社,2003.

[2]李駒光.ARM應用系統開發詳解:基于 S3C4510B的系統設計[M].北京:清華大學出版社,2003.

[3]曹程遠.U-Boot在 S3C2410上的移植[J].微型電腦應用,2005,21(7):48-50.

[4]郭志,江秀臣,曾奕.一個嵌入式系統的啟動分析[J].微計算機信息,2005,21(32):28-30.

[5]陳海軍,申衛昌,史穎.嵌入式系統引導程序詳探[J].計算機技術與發展,2006,16(1):123-125,128.

[6]Microsoft Corporation. Microsoft extensible firmware initiative FAT32 file system specification [M ]. 1st ed. [S.l.]:[s.n.], 2000.

[7]SanDisk Corporation. Sandisk secure digital card product manual[M ]. 2nd ed. [S.l.]: [s.n.], 2004.

[8]Sumsung Electronics. S3C2410X 32 b risc microprocessor user′ s manual[M]. [S.l.]: [s.n.], 2003.

[9]霍拉鮑夫.嵌入式Linux:硬件、軟件與接口[M].陳雷,譯.北京:電子工業出版社,2003.

[10]徐睿,黃健,徐辰.基于 ARM的嵌入式系統開發與應用[M].北京:人民郵電出版社,2004.

[11]李善平.Linux與嵌入式系統[M].北京:清華大學出版社,2002.

主站蜘蛛池模板: 免费在线a视频| 国产在线自在拍91精品黑人| 精品无码视频在线观看| 国产精品九九视频| 国产成人a毛片在线| 2020国产在线视精品在| 欧美狠狠干| 青青国产在线| 小13箩利洗澡无码视频免费网站| 日本国产在线| 中文字幕欧美成人免费| 国产69囗曝护士吞精在线视频| 亚洲综合片| 正在播放久久| 国产亚洲现在一区二区中文| 欧美区一区| 亚洲性影院| 亚洲一区国色天香| 亚洲成人在线网| 欧美日韩第三页| 久久窝窝国产精品午夜看片| 亚洲成人一区二区三区| 亚洲国产日韩一区| 国产va视频| 国产一区二区网站| 日韩精品一区二区深田咏美| 欧亚日韩Av| 免费看一级毛片波多结衣| 91精品国产自产在线观看| 91精品专区| 99久久免费精品特色大片| 国产欧美日韩18| 国产精品免费电影| 欧美一级专区免费大片| 成人福利在线观看| 高清久久精品亚洲日韩Av| 欧美国产在线精品17p| 午夜精品影院| 999福利激情视频| 国产精品欧美在线观看| 欧美日韩精品一区二区在线线 | 久久综合一个色综合网| 日本欧美中文字幕精品亚洲| 在线国产你懂的| 欧美一级一级做性视频| 久热中文字幕在线| 国产一级无码不卡视频| 亚洲欧美不卡| 午夜电影在线观看国产1区| 国产精品成人一区二区| 亚洲国产成人无码AV在线影院L| 久久99久久无码毛片一区二区| 国产成人综合久久| 成人在线欧美| 欧美亚洲日韩不卡在线在线观看| 国产亚洲美日韩AV中文字幕无码成人| 国产精品无码一区二区桃花视频| 99视频在线免费观看| 性欧美在线| 国内精品视频| 最新亚洲av女人的天堂| 1769国产精品视频免费观看| 91福利免费视频| 亚洲精品手机在线| 国产视频一区二区在线观看| 欧美va亚洲va香蕉在线| 无码粉嫩虎白一线天在线观看| 久草视频中文| 奇米影视狠狠精品7777| 日韩欧美国产三级| 另类综合视频| 亚洲第一极品精品无码| 都市激情亚洲综合久久| 天堂va亚洲va欧美va国产| 国产91透明丝袜美腿在线| 亚洲综合第一区| 97色婷婷成人综合在线观看| 国产一区二区三区日韩精品| 国产无遮挡裸体免费视频| 欧美一级夜夜爽www| 香蕉99国内自产自拍视频| 精品亚洲麻豆1区2区3区|