版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第7章嵌入式Linux引導(dǎo)程序7.1引導(dǎo)程序(Bootloader)概述7.2ARMBootloader的作用7.3Bootloader通用的概念7.4Bootloader的主要任務(wù)與框架結(jié)構(gòu)7.5vivi7.6vivi移植實(shí)例(移植vivi到博創(chuàng)2410)本章小結(jié)
7.1引導(dǎo)程序(Bootloader)概述
簡(jiǎn)單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行前運(yùn)行的一段小程序。通過這段小程序,可以對(duì)硬件設(shè)備,如CPU、SDRAM、Flash、串口等進(jìn)行初始化,也可以下載文件到開發(fā)板,對(duì)Flash進(jìn)行擦除和編程,真正起到引導(dǎo)和加載內(nèi)核鏡像的作用。
7.2ARMBootloader的作用
1.初始化RAM(必需)
Bootloader必須能夠初始化RAM,因?yàn)閷硐到y(tǒng)要通過它保存一些數(shù)據(jù),但具體地實(shí)現(xiàn)要依賴與具體的CPU以及硬件系統(tǒng)。
2.初始化串口(可選,推薦)
Bootloader應(yīng)該要初始化以及使能至少一個(gè)串口,通過它與控制臺(tái)聯(lián)系進(jìn)行一些debug的工作,甚至與PC通信。
3.啟動(dòng)內(nèi)核鏡像(必需)
根據(jù)內(nèi)核鏡像保存的存儲(chǔ)介質(zhì)不同,可以有兩種啟動(dòng)方式:Falsh啟動(dòng)以及RAM啟動(dòng),但是無論是哪種啟動(dòng)方式,下面的系統(tǒng)狀態(tài)必須得到滿足:
(1)?CPU寄存器的設(shè)置。
(2)?Cache和MMU(MemoryManagementUnit)的設(shè)置。
7.3Bootloader通用的概念
1.?Bootloader所支持的CPU和嵌入式板
通常,每種不同的CPU體系結(jié)構(gòu)都有不同的Bootloader。有些Bootloader也支持多種體系結(jié)構(gòu)的CPU,比如U-Boot就同時(shí)支持ARM體系結(jié)構(gòu)和MIPS等體系結(jié)構(gòu)。
2.?Bootloader的安裝媒介
系統(tǒng)加電或復(fù)位后,所有的處理器通常都從某個(gè)預(yù)先安排的地址上取指令。比如,ARM在復(fù)位時(shí)從地址0x0取指。嵌入式系統(tǒng)中通常都有某種類型的固態(tài)存儲(chǔ)設(shè)備(比如:ROM、EEPROM或Flash等)被映射到這個(gè)預(yù)先安排的地址上。通常Bootloader程序被固化在開發(fā)板上的地址是0x00000000,因此在系統(tǒng)加電后,處理器將首先執(zhí)行Bootloader程序,Bootloader是最先被系統(tǒng)執(zhí)行的程序。固態(tài)存儲(chǔ)設(shè)備的典型空間分配結(jié)構(gòu),如圖7-1所示。圖7-1固態(tài)存儲(chǔ)設(shè)備的空間分配結(jié)構(gòu)
3.?Bootloader的控制方式
主機(jī)和目標(biāo)機(jī)之間一般通過串口建立連接,Bootloader軟件在執(zhí)行時(shí)通常會(huì)通過串口來進(jìn)行通信,比如:輸出打印信息到串口,從串口讀取用戶控制字符,也可以通過JTAG等其他接口進(jìn)行通信。
4.?Bootloader的操作模式
大多數(shù)Bootloader都包含啟動(dòng)加載模式(BootLoading)和下載模式(DownLoading)兩種不同的操作模式。
5.?Bootloader與主機(jī)通信
Bootloader與主機(jī)通信通常有兩種方式:
(1)串口通信。
(2)通過以太網(wǎng)通信。
7.4Bootloader的主要任務(wù)與框架結(jié)構(gòu)
1.?Bootloader的stage1
1)基本的硬件初始化
(1)屏蔽所有的中斷。
(2)設(shè)置CPU的速度和時(shí)鐘頻率。
(3)?RAM初始化。
(4)初始化LED(可據(jù)具體的嵌入式板來選擇)。
(5)關(guān)閉CPU內(nèi)部指令/數(shù)據(jù)cache。
2)為加載stage2準(zhǔn)備RAM空間
(1)先保存memorypage一開始兩個(gè)字的內(nèi)容。
(2)向這兩個(gè)字中寫入任意的數(shù)字。比如:向第一個(gè)字寫入0x55(01010101),第二個(gè)字寫入0xaa(10101010)。
(3)然后,立即將這兩個(gè)字的內(nèi)容讀回。顯然,讀到的內(nèi)容應(yīng)該分別是0x55和0xaa。如果不是,則說明這個(gè)memorypage所占據(jù)的地址范圍不是一段有效的RAM空間。
(4)恢復(fù)這兩個(gè)字的原始內(nèi)容。測(cè)試完畢。
3)拷貝stage2到RAM中
拷貝時(shí)要確定和注意兩點(diǎn):
①?stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;
②?RAM空間的起始地址。
4)設(shè)置堆棧指針sp
堆棧指針sp的設(shè)置是為了執(zhí)行C語言代碼做好準(zhǔn)備。通??梢园裺p的值設(shè)置為(stage2_end-4),也即安排的那個(gè)1MB的RAM空間的最頂端(堆棧向下生長(zhǎng))。此外,在設(shè)置堆棧指針sp之前,也可以關(guān)閉LED,以提示用戶代碼執(zhí)行準(zhǔn)備跳轉(zhuǎn)到stage2。
5)跳轉(zhuǎn)到stage2的C入口點(diǎn)
在上述一切都就緒后,就可以跳轉(zhuǎn)到Bootloader的stage2去執(zhí)行了。比如,在ARM系統(tǒng)中,這可以通過修改PC寄存器為合適的地址來實(shí)現(xiàn)。如:
ldrpc_start_armboot
2.?Bootloader的stage2
Bootloader的stage2的代碼通常用C語言來實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時(shí),不能使用glibc庫(kù)中的任何支持函數(shù)。本階段的主要任務(wù)如下:
(1)初始化本階段要使用到的硬件設(shè)備。
(2)檢測(cè)系統(tǒng)的內(nèi)存映射(memorymap)。
(3)加載內(nèi)核映像和根文件系統(tǒng)映像。
(4)設(shè)置內(nèi)核的啟動(dòng)參數(shù)。
(5)調(diào)用內(nèi)核。
7.5vivi
7.5.1vivi簡(jiǎn)介
vivi是由韓國(guó)Mizi公司開發(fā)的一種Bootloader,適合于ARM9處理器,支持S3c2410處理器。vivi具有結(jié)構(gòu)清晰、功能豐富的特點(diǎn)。7.5.2vivi的軟件結(jié)構(gòu)分析
vivi的軟件結(jié)構(gòu)從總體上可分為四個(gè)層次:vivi配置、vivi編譯、stage1和stage2。另外,vivi還提供了測(cè)試程序和工具,并且有簡(jiǎn)明的文檔。圖7-2vivi從配置到最后生成的總體流程圖
1.?vivi配置原理
以makemenuconfig為例說明vivi配置過程。
執(zhí)行makemenuconfig,會(huì)執(zhí)行主Makefile中:
menuconfig:include/version.h
$(MAKE)-Cscripts/lxdialogall
$(CONFIG_SHELL)scripts/Menuconfigarch/config.in在makemenuconfig的時(shí)候,會(huì)打印出如下的內(nèi)容:
2.?vivi編譯原理
vivi編譯流程是由Makefile來決定的。Makefile從總體上講可分三個(gè)部分:定義變量、編譯規(guī)則和配置規(guī)則。
1)主Makefile分析
(1)定義變量。
版本號(hào):在生成的vivi中,開頭的版本號(hào)是由下面的變量來定義的。
VERSION=0
PATCHLEVEL=1
SUBLEVEL=4
VIVI:這里設(shè)置輸出版本信息的格式,VIVIRELEASE=0.1.4。
VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$
(SUBLEVEL)
(2)編譯規(guī)則。
all依賴目標(biāo)do-it-all,偽目標(biāo):all,可參看第3章Makefile小節(jié)內(nèi)容。
all:do-it-all
wildcard函數(shù)功能:列出當(dāng)前目錄下所有符合模式“PATTERN”格式的文件名。返回值:空格分割的、存在當(dāng)前目錄下的所有符合模式“PATTERN”的文件名。
2)子Makefile分析
在實(shí)際的vivi的源碼還有很多其他的Makefile,在vivi/
下的Makefile稱為主Makefile,在其他一些目錄下,都有獨(dú)立的Makefile,稱之為子Makefile??偟墓ぷ魇怯芍鱉akefile來調(diào)度的,那么這些子Makefile怎么來完成工作?它是由一個(gè)非常重要的文件:Rules.make來管理的,它是文件編譯所需要共同遵守的規(guī)則文件。如drivers/?下的一個(gè)Makefile:
subdir-y:=serial
subdir-$(CONFIG_MTD)+=mtd
include$(TOPDIR)/Rules.make7.5.3vivi啟動(dòng)原理
與大多數(shù)Bootloader一樣,vivi的運(yùn)行過程也分為兩個(gè)階段:
第一階段的運(yùn)行代碼在vivi/arch/s3c2410/head.s中定義,大小不超過4kB,它是從Flash啟動(dòng)系統(tǒng)的引導(dǎo)代碼,它包括對(duì)S3C2410基本硬件的初始化,從NANDFlash上復(fù)制整個(gè)VIVI代碼到RAM并跳轉(zhuǎn)到第二階段執(zhí)行,其主要步驟如圖7-3所示。圖7-3vivi的第一階段主要步驟第二階段C語言代碼是從init/main.c的main函數(shù)開始執(zhí)行,是在RAM中運(yùn)行的,其主要步驟如圖7-4所示。圖7-4vivi的第二階段主要步驟
1.?vivi的第一階段
1)禁止看門狗
上電后,WATCHDOG默認(rèn)是開著的,代碼如下:
movr1,#0x53000000;WTCON寄存器地址是0x53000000,清0
movr2,#0x0
strr2,[r1]
2)禁止中斷
vivi中沒用到中斷,所以要關(guān)中斷,代碼如下:
movr1,#INT_CTL_BASE
movr2,#0xffffffff
str r2,[r1,#oINTMSK];掩碼關(guān)閉所有中斷
ldr r2,=0x7ff
str r2,[r1,#oINTSUBMSK]
3)設(shè)置CPU的速度和時(shí)鐘頻率
初始化時(shí)鐘:
movr1,#CLK_CTL_BASE
mvnr2,#0xff000000
strr2,[r1,#oLOCKTIME]
4)初始化內(nèi)存控制寄存器
5)設(shè)置串口
6)將vivi的所有代碼從Flash中拷貝到RAM中
7)跳轉(zhuǎn)到main()函數(shù)
圖7-5執(zhí)行vivistage1后內(nèi)存的劃分情況
2.?vivi的第二階段
第二階段的入口就是init/main.c,按照源代碼的組織流程,根據(jù)模塊化劃分的原則,此階段可分為8個(gè)功能模塊。
1)打印版本信息
2)開發(fā)板初始化
3)內(nèi)存映射和內(nèi)存管理單元的初始化
mem_map_init();
mmu_init();
這兩個(gè)函數(shù)都在?/arch/s3c2410/mmu.c文件中。圖7-6創(chuàng)建頁(yè)表后內(nèi)存的劃分情況
4)初始化堆棧
heap_init()。(定義在\vivi\lib\heap.c文件中)
intheap_init(void)
{
returnmmalloc_init((unsignedchar*)(HEAP_BASE),
HEAP_SIZE);
}圖7-7初始化堆棧后內(nèi)存的劃分情況
5)初始化mtd設(shè)備
6)初始化私有數(shù)據(jù)
init_priv_data()函數(shù)在\vivi\lib\priv_data\rw.c文件中。圖7-8初始化私有數(shù)據(jù)后內(nèi)存的劃分情況
7)初始化內(nèi)置命令
misc()和init_builtin_cmds()。
8)啟動(dòng)內(nèi)核
boot_or_vivi(),此函數(shù)根據(jù)情況通過“vivi_shellvivi_
shell()”啟動(dòng)一個(gè)shell(如果配置了CONFIG_SERIAL_TERM)
進(jìn)入與用戶進(jìn)行交互的界面,或者直接啟動(dòng)linux內(nèi)核。圖7-9vivi啟動(dòng)內(nèi)核后內(nèi)存的劃分情況
7.6vivi移植實(shí)例(移植vivi到博創(chuàng)2410)
vivi的移植方法步驟:
(1)對(duì)vivi進(jìn)行移植修改;
(2)對(duì)vivi進(jìn)行配置、編譯;
(3)燒寫vivi;
(4)測(cè)試vivi。7.6.1對(duì)vivi進(jìn)行移植修改
1.修改vivi/Makefile
1)修改交叉編譯庫(kù)和頭文件
(1)修改編譯器路徑。
將:CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-
修改為:CROSS_COMPILE=符合本機(jī)的路徑
本機(jī)CROSS_COMPILE的路徑為:
?CROSS_COMPILE=/opt/host/armv4l/bin/armv4l-unknown-linux-
(2)修改編譯器庫(kù)文件路徑。
將:ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3
修改為:ARM_GCC_LIBS=符合本機(jī)的路徑
本機(jī)ARM_GCC_LIBS的路徑為:
?ARM_GCC_LIBS=/opt/host/armv4l/bin/gcc-lib/armv4l-unknown-linux/2.95.2
2)?Linux內(nèi)核包含文件
將:LINUX_INCLUDE_DIR=/usr/local/arm/2.95.3/include
修改Linux頭文件所在路徑:LINUX_INCLUDE_DIR=符合本機(jī)的
本機(jī)LINUX_INCLUDE_DIR的路徑為:
?LINUX_INCLUDE_DIR=/opt/host/armv4l/include
2.修改vivi中與硬件相關(guān)的部分
與具體運(yùn)行在哪一個(gè)處理器平臺(tái)上相關(guān)的文件都存放在vivi/arch/目錄下,本系統(tǒng)使用S3C2410x處理器,對(duì)應(yīng)的目錄為s3c2410。其中,head.s文件是vivi啟動(dòng)配置代碼,加電復(fù)位運(yùn)行的代碼就是從這里開始的。
3.支持NandFlash啟動(dòng)的修改(vivi/arch/s3c2410
/smdk.c)
1)修改NandFlash分區(qū)
系統(tǒng)存儲(chǔ)器使用64MB的NandFlash,因此vivi要從NandFlash啟動(dòng)。NandFlash只適合用來存放數(shù)據(jù),不能夠直接在其上執(zhí)行程序指令。
2)修改默認(rèn)參數(shù)
xmodem_timeout需要調(diào)整到30000000,不然在使用下載時(shí)很容易出現(xiàn)下載失敗的信息,如:“Retry0:NAKonsector”;
"boot_delay"o為下載模式(DownLoading)下的時(shí)間延時(shí),在這段時(shí)間里,如果開發(fā)人員不輸入任何vivi中的命令,則vivi將自動(dòng)引導(dǎo)內(nèi)核。本系統(tǒng)修改為:0x1000000。
3)修改啟動(dòng)命令
在intdefault_nb_params=ARRAY_SIZE(default_vivi_
parameters)下添加:
charlinux_cmd[]="noinitrdroot=/dev/mtdblock3init=/linuxrcconsole=ttySAC0,115200rootfstype=cramfsdevfs=mountmem=64M";啟動(dòng)命令:7.6.2對(duì)vivi進(jìn)行配置與編譯
進(jìn)入vivi目錄執(zhí)行“makeclean”,在編譯之前將vivi里所有的“.o”和“.o.flag”文件刪除。輸入“makemenuconfig”進(jìn)入配置界面,如圖7-10所示。圖7-10vivi配置界面輸入“make”對(duì)vivi進(jìn)行編譯,make沒有錯(cuò)誤,編譯后在當(dāng)前目錄下會(huì)生成vivi的二進(jìn)制代碼文件vivi,如圖7-11所示,這樣就可將其燒寫進(jìn)開發(fā)板中,驗(yàn)證是否能將內(nèi)核引導(dǎo)起來。圖7-11vivi編譯結(jié)果7.6.3燒寫vivi
開發(fā)板上已經(jīng)存在vivi時(shí),可以用串口燒寫;開發(fā)板上不存在vivi時(shí),用jtag口燒寫。
1.串口下載vivi
1)格式化flash
打開超級(jí)終端,先按住PC機(jī)鍵盤的BackSpace鍵,然后啟動(dòng)2410-S,進(jìn)入vivi,按照以下命令格式化flash,重新分區(qū),如圖7-12所示。
vivi>bonpart0128k192k2240k6336k:m65536k回車圖7-12格式化flash
2)燒寫vivi
這時(shí)已格式化flash,運(yùn)行的是SDRAM中的vivi。注意如果這時(shí)重啟或斷電會(huì)丟失所有數(shù)據(jù),否則必須用Jtag重新燒寫vivi。
vivi>loadflashvivix回車
點(diǎn)擊超級(jí)終端任務(wù)欄上“傳送”下拉菜單中的“發(fā)送文件”,選擇協(xié)議為Xmodem,選擇鏡像文件vivi,點(diǎn)擊“發(fā)送”,如圖7-13所示,10秒左右vivi就燒寫到flash中了。圖7-13串口燒寫vivi
2.?Jtag口燒寫
把并口線插到PC機(jī)的并口,并把并口和Jtag相連,Jtag和博創(chuàng)開發(fā)板的14針Jtag口相連。
運(yùn)行Jtag燒寫文件sjf2410-s.exe命令如下:
sjf2410
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度事業(yè)單位臨時(shí)聘用展覽策劃人員服務(wù)協(xié)議2篇
- 2024年機(jī)動(dòng)車輛運(yùn)輸合同-涉及二手車運(yùn)輸業(yè)務(wù)
- 2024年度智能家居系統(tǒng)集成與安裝承包服務(wù)合同3篇
- 2024年沉井施工智能化施工設(shè)備研發(fā)與集成合同3篇
- 2024年物業(yè)共有部位維修保養(yǎng)合同
- 2024年校園水果配送合同3篇
- 2024年按揭貸款房產(chǎn)投資貸款合同模板3篇
- 2024版不銹鋼宣傳欄外觀翻新與維修服務(wù)合同3篇
- 2024年度網(wǎng)絡(luò)虛擬物品買賣合同補(bǔ)充協(xié)議范文3篇
- 2024年標(biāo)準(zhǔn)離婚合同書模板:雙方協(xié)商一致版
- 2024-2030年中國(guó)建筑施工行業(yè)發(fā)展?fàn)顩r規(guī)劃分析報(bào)告
- 2025年1月“八省聯(lián)考”考前猜想卷英語試題01 含解析
- 企業(yè)行政總監(jiān)個(gè)人簡(jiǎn)歷范文
- 2024版智能水務(wù)管理系統(tǒng)設(shè)計(jì)與施工合同3篇
- 冬季物業(yè)安全管理培訓(xùn)
- 魯迅先生的生平及其背景
- 2025年1月“八省聯(lián)考”考前猜想卷(含答案解析)
- 2024年度餐飲業(yè)智能點(diǎn)餐系統(tǒng)合同
- GB/T 11981-2024建筑用輕鋼龍骨
- 修大棚合同范例
- 2024年高考物理復(fù)習(xí)試題分類訓(xùn)練:電場(chǎng)(學(xué)生卷)
評(píng)論
0/150
提交評(píng)論