《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第7章_第1頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第7章_第2頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第7章_第3頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第7章_第4頁
《基于ARM9的嵌入式Linux系統(tǒng)開發(fā)原理與實踐》課件第7章_第5頁
已閱讀5頁,還剩66頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7章嵌入式Linux引導程序7.1引導程序(Bootloader)概述7.2ARMBootloader的作用7.3Bootloader通用的概念7.4Bootloader的主要任務與框架結構7.5vivi7.6vivi移植實例(移植vivi到博創(chuàng)2410)本章小結

7.1引導程序(Bootloader)概述

簡單地說,Bootloader就是在操作系統(tǒng)內核運行前運行的一段小程序。通過這段小程序,可以對硬件設備,如CPU、SDRAM、Flash、串口等進行初始化,也可以下載文件到開發(fā)板,對Flash進行擦除和編程,真正起到引導和加載內核鏡像的作用。

7.2ARMBootloader的作用

1.初始化RAM(必需)

Bootloader必須能夠初始化RAM,因為將來系統(tǒng)要通過它保存一些數(shù)據(jù),但具體地實現(xiàn)要依賴與具體的CPU以及硬件系統(tǒng)。

2.初始化串口(可選,推薦)

Bootloader應該要初始化以及使能至少一個串口,通過它與控制臺聯(lián)系進行一些debug的工作,甚至與PC通信。

3.啟動內核鏡像(必需)

根據(jù)內核鏡像保存的存儲介質不同,可以有兩種啟動方式:Falsh啟動以及RAM啟動,但是無論是哪種啟動方式,下面的系統(tǒng)狀態(tài)必須得到滿足:

(1)?CPU寄存器的設置。

(2)?Cache和MMU(MemoryManagementUnit)的設置。

7.3Bootloader通用的概念

1.?Bootloader所支持的CPU和嵌入式板

通常,每種不同的CPU體系結構都有不同的Bootloader。有些Bootloader也支持多種體系結構的CPU,比如U-Boot就同時支持ARM體系結構和MIPS等體系結構。

2.?Bootloader的安裝媒介

系統(tǒng)加電或復位后,所有的處理器通常都從某個預先安排的地址上取指令。比如,ARM在復位時從地址0x0取指。嵌入式系統(tǒng)中通常都有某種類型的固態(tài)存儲設備(比如:ROM、EEPROM或Flash等)被映射到這個預先安排的地址上。通常Bootloader程序被固化在開發(fā)板上的地址是0x00000000,因此在系統(tǒng)加電后,處理器將首先執(zhí)行Bootloader程序,Bootloader是最先被系統(tǒng)執(zhí)行的程序。固態(tài)存儲設備的典型空間分配結構,如圖7-1所示。圖7-1固態(tài)存儲設備的空間分配結構

3.?Bootloader的控制方式

主機和目標機之間一般通過串口建立連接,Bootloader軟件在執(zhí)行時通常會通過串口來進行通信,比如:輸出打印信息到串口,從串口讀取用戶控制字符,也可以通過JTAG等其他接口進行通信。

4.?Bootloader的操作模式

大多數(shù)Bootloader都包含啟動加載模式(BootLoading)和下載模式(DownLoading)兩種不同的操作模式。

5.?Bootloader與主機通信

Bootloader與主機通信通常有兩種方式:

(1)串口通信。

(2)通過以太網(wǎng)通信。

7.4Bootloader的主要任務與框架結構

1.?Bootloader的stage1

1)基本的硬件初始化

(1)屏蔽所有的中斷。

(2)設置CPU的速度和時鐘頻率。

(3)?RAM初始化。

(4)初始化LED(可據(jù)具體的嵌入式板來選擇)。

(5)關閉CPU內部指令/數(shù)據(jù)cache。

2)為加載stage2準備RAM空間

(1)先保存memorypage一開始兩個字的內容。

(2)向這兩個字中寫入任意的數(shù)字。比如:向第一個字寫入0x55(01010101),第二個字寫入0xaa(10101010)。

(3)然后,立即將這兩個字的內容讀回。顯然,讀到的內容應該分別是0x55和0xaa。如果不是,則說明這個memorypage所占據(jù)的地址范圍不是一段有效的RAM空間。

(4)恢復這兩個字的原始內容。測試完畢。

3)拷貝stage2到RAM中

拷貝時要確定和注意兩點:

①?stage2的可執(zhí)行映像在固態(tài)存儲設備的存放起始地址和終止地址;

②?RAM空間的起始地址。

4)設置堆棧指針sp

堆棧指針sp的設置是為了執(zhí)行C語言代碼做好準備。通??梢园裺p的值設置為(stage2_end-4),也即安排的那個1MB的RAM空間的最頂端(堆棧向下生長)。此外,在設置堆棧指針sp之前,也可以關閉LED,以提示用戶代碼執(zhí)行準備跳轉到stage2。

5)跳轉到stage2的C入口點

在上述一切都就緒后,就可以跳轉到Bootloader的stage2去執(zhí)行了。比如,在ARM系統(tǒng)中,這可以通過修改PC寄存器為合適的地址來實現(xiàn)。如:

ldrpc_start_armboot

2.?Bootloader的stage2

Bootloader的stage2的代碼通常用C語言來實現(xiàn),以便于實現(xiàn)更復雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應用程序不同的是,在編譯和鏈接Bootloader這樣的程序時,不能使用glibc庫中的任何支持函數(shù)。本階段的主要任務如下:

(1)初始化本階段要使用到的硬件設備。

(2)檢測系統(tǒng)的內存映射(memorymap)。

(3)加載內核映像和根文件系統(tǒng)映像。

(4)設置內核的啟動參數(shù)。

(5)調用內核。

7.5vivi

7.5.1vivi簡介

vivi是由韓國Mizi公司開發(fā)的一種Bootloader,適合于ARM9處理器,支持S3c2410處理器。vivi具有結構清晰、功能豐富的特點。7.5.2vivi的軟件結構分析

vivi的軟件結構從總體上可分為四個層次:vivi配置、vivi編譯、stage1和stage2。另外,vivi還提供了測試程序和工具,并且有簡明的文檔。圖7-2vivi從配置到最后生成的總體流程圖

1.?vivi配置原理

以makemenuconfig為例說明vivi配置過程。

執(zhí)行makemenuconfig,會執(zhí)行主Makefile中:

menuconfig:include/version.h

$(MAKE)-Cscripts/lxdialogall

$(CONFIG_SHELL)scripts/Menuconfigarch/config.in在makemenuconfig的時候,會打印出如下的內容:

2.?vivi編譯原理

vivi編譯流程是由Makefile來決定的。Makefile從總體上講可分三個部分:定義變量、編譯規(guī)則和配置規(guī)則。

1)主Makefile分析

(1)定義變量。

版本號:在生成的vivi中,開頭的版本號是由下面的變量來定義的。

VERSION=0

PATCHLEVEL=1

SUBLEVEL=4

VIVI:這里設置輸出版本信息的格式,VIVIRELEASE=0.1.4。

VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$

(SUBLEVEL)

(2)編譯規(guī)則。

all依賴目標do-it-all,偽目標:all,可參看第3章Makefile小節(jié)內容。

all:do-it-all

wildcard函數(shù)功能:列出當前目錄下所有符合模式“PATTERN”格式的文件名。返回值:空格分割的、存在當前目錄下的所有符合模式“PATTERN”的文件名。

2)子Makefile分析

在實際的vivi的源碼還有很多其他的Makefile,在vivi/

下的Makefile稱為主Makefile,在其他一些目錄下,都有獨立的Makefile,稱之為子Makefile??偟墓ぷ魇怯芍鱉akefile來調度的,那么這些子Makefile怎么來完成工作?它是由一個非常重要的文件:Rules.make來管理的,它是文件編譯所需要共同遵守的規(guī)則文件。如drivers/?下的一個Makefile:

subdir-y:=serial

subdir-$(CONFIG_MTD)+=mtd

include$(TOPDIR)/Rules.make7.5.3vivi啟動原理

與大多數(shù)Bootloader一樣,vivi的運行過程也分為兩個階段:

第一階段的運行代碼在vivi/arch/s3c2410/head.s中定義,大小不超過4kB,它是從Flash啟動系統(tǒng)的引導代碼,它包括對S3C2410基本硬件的初始化,從NANDFlash上復制整個VIVI代碼到RAM并跳轉到第二階段執(zhí)行,其主要步驟如圖7-3所示。圖7-3vivi的第一階段主要步驟第二階段C語言代碼是從init/main.c的main函數(shù)開始執(zhí)行,是在RAM中運行的,其主要步驟如圖7-4所示。圖7-4vivi的第二階段主要步驟

1.?vivi的第一階段

1)禁止看門狗

上電后,WATCHDOG默認是開著的,代碼如下:

movr1,#0x53000000;WTCON寄存器地址是0x53000000,清0

movr2,#0x0

strr2,[r1]

2)禁止中斷

vivi中沒用到中斷,所以要關中斷,代碼如下:

movr1,#INT_CTL_BASE

movr2,#0xffffffff

str r2,[r1,#oINTMSK];掩碼關閉所有中斷

ldr r2,=0x7ff

str r2,[r1,#oINTSUBMSK]

3)設置CPU的速度和時鐘頻率

初始化時鐘:

movr1,#CLK_CTL_BASE

mvnr2,#0xff000000

strr2,[r1,#oLOCKTIME]

4)初始化內存控制寄存器

5)設置串口

6)將vivi的所有代碼從Flash中拷貝到RAM中

7)跳轉到main()函數(shù)

圖7-5執(zhí)行vivistage1后內存的劃分情況

2.?vivi的第二階段

第二階段的入口就是init/main.c,按照源代碼的組織流程,根據(jù)模塊化劃分的原則,此階段可分為8個功能模塊。

1)打印版本信息

2)開發(fā)板初始化

3)內存映射和內存管理單元的初始化

mem_map_init();

mmu_init();

這兩個函數(shù)都在?/arch/s3c2410/mmu.c文件中。圖7-6創(chuàng)建頁表后內存的劃分情況

4)初始化堆棧

heap_init()。(定義在\vivi\lib\heap.c文件中)

intheap_init(void)

{

returnmmalloc_init((unsignedchar*)(HEAP_BASE),

HEAP_SIZE);

}圖7-7初始化堆棧后內存的劃分情況

5)初始化mtd設備

6)初始化私有數(shù)據(jù)

init_priv_data()函數(shù)在\vivi\lib\priv_data\rw.c文件中。圖7-8初始化私有數(shù)據(jù)后內存的劃分情況

7)初始化內置命令

misc()和init_builtin_cmds()。

8)啟動內核

boot_or_vivi(),此函數(shù)根據(jù)情況通過“vivi_shellvivi_

shell()”啟動一個shell(如果配置了CONFIG_SERIAL_TERM)

進入與用戶進行交互的界面,或者直接啟動linux內核。圖7-9vivi啟動內核后內存的劃分情況

7.6vivi移植實例(移植vivi到博創(chuàng)2410)

vivi的移植方法步驟:

(1)對vivi進行移植修改;

(2)對vivi進行配置、編譯;

(3)燒寫vivi;

(4)測試vivi。7.6.1對vivi進行移植修改

1.修改vivi/Makefile

1)修改交叉編譯庫和頭文件

(1)修改編譯器路徑。

將:CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-

修改為:CROSS_COMPILE=符合本機的路徑

本機CROSS_COMPILE的路徑為:

?CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-

(2)修改編譯器庫文件路徑。

將:ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3

修改為:ARM_GCC_LIBS=符合本機的路徑

本機ARM_GCC_LIBS的路徑為:

?ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2

2)?Linux內核包含文件

將:LINUX_INCLUDE_DIR=/usr/local/arm/2.95.3/include

修改Linux頭文件所在路徑:LINUX_INCLUDE_DIR=符合本機的

本機LINUX_INCLUDE_DIR的路徑為:

?LINUX_INCLUDE_DIR=/opt/host/armv4l/include

2.修改vivi中與硬件相關的部分

與具體運行在哪一個處理器平臺上相關的文件都存放在vivi/arch/目錄下,本系統(tǒng)使用S3C2410x處理器,對應的目錄為s3c2410。其中,head.s文件是vivi啟動配置代碼,加電復位運行的代碼就是從這里開始的。

3.支持NandFlash啟動的修改(vivi/arch/s3c2410

/smdk.c)

1)修改NandFlash分區(qū)

系統(tǒng)存儲器使用64MB的NandFlash,因此vivi要從NandFlash啟動。NandFlash只適合用來存放數(shù)據(jù),不能夠直接在其上執(zhí)行程序指令。

2)修改默認參數(shù)

xmodem_timeout需要調整到30000000,不然在使用下載時很容易出現(xiàn)下載失敗的信息,如:“Retry0:NAKonsector”;

"boot_delay"o為下載模式(DownLoading)下的時間延時,在這段時間里,如果開發(fā)人員不輸入任何vivi中的命令,則vivi將自動引導內核。本系統(tǒng)修改為:0x1000000。

3)修改啟動命令

在intdefault_nb_params=ARRAY_SIZE(default_vivi_

parameters)下添加:

charlinux_cmd[]="noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0,115200rootfstype=cramfsdevfs=mountmem=64M";啟動命令:7.6.2對vivi進行配置與編譯

進入vivi目錄執(zhí)行“makeclean”,在編譯之前將vivi里所有的“.o”和“.o.flag”文件刪除。輸入“makemenuconfig”進入配置界面,如圖7-10所示。圖7-10vivi配置界面輸入“make”對vivi進行編譯,make沒有錯誤,編譯后在當前目錄下會生成vivi的二進制代碼文件vivi,如圖7-11所示,這樣就可將其燒寫進開發(fā)板中,驗證是否能將內核引導起來。圖7-11vivi編譯結果7.6.3燒寫vivi

開發(fā)板上已經(jīng)存在vivi時,可以用串口燒寫;開發(fā)板上不存在vivi時,用jtag口燒寫。

1.串口下載vivi

1)格式化flash

打開超級終端,先按住PC機鍵盤的BackSpace鍵,然后啟動2410-S,進入vivi,按照以下命令格式化flash,重新分區(qū),如圖7-12所示。

vivi>bonpart0128k192k2240k6336k:m65536k回車圖7-12格式化flash

2)燒寫vivi

這時已格式化flash,運行的是SDRAM中的vivi。注意如果這時重啟或斷電會丟失所有數(shù)據(jù),否則必須用Jtag重新燒寫vivi。

vivi>loadflashvivix回車

點擊超級終端任務欄上“傳送”下拉菜單中的“發(fā)送文件”,選擇協(xié)議為Xmodem,選擇鏡像文件vivi,點擊“發(fā)送”,如圖7-13所示,10秒左右vivi就燒寫到flash中了。圖7-13串口燒寫vivi

2.?Jtag口燒寫

把并口線插到PC機的并口,并把并口和Jtag相連,Jtag和博創(chuàng)開發(fā)板的14針Jtag口相連。

運行Jtag燒寫文件sjf2410-s.exe命令如下:

sjf2410

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論