亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2809 | 回復(fù): 1
打印 上一主題 下一主題

[BootLoader] Bootloader之uBoot簡介 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-06-27 17:36 |只看該作者 |倒序?yàn)g覽
一、Bootloader的引入
從前面的硬件實(shí)驗(yàn)可以知道,系統(tǒng)上電之后,需要一段程序來進(jìn)行初始化:關(guān)閉WATCHDOG、改變系統(tǒng)時鐘、初始化存儲控制器、將更多的代碼復(fù)制到內(nèi)存中 等等。如果它能將操作系統(tǒng)內(nèi)核(無論從本地,比如Flash;還是從遠(yuǎn)端,比如通過網(wǎng)絡(luò))復(fù)制到內(nèi)存中運(yùn)行,就稱這段程序?yàn)锽ootloader。
簡單地說,Bootloader就是這么一小段程序,它在系統(tǒng)上電時開始執(zhí)行,初始化硬件設(shè)備、準(zhǔn)備好軟件環(huán)境,最后調(diào)用操作系統(tǒng)內(nèi)核。
可以增強(qiáng)Bootloader的功能,比如增加網(wǎng)絡(luò)功能、從PC上通過串口或網(wǎng)絡(luò)下載文件、燒寫文件、將Flash上壓縮的文件解壓后再運(yùn)行等──這就是 一個功能更為強(qiáng)大的Bootloader,也稱為Monitor。實(shí)際上,在最終產(chǎn)品中用戶并不需要這些功能,它們只是為了方便開發(fā)。
Bootloader的實(shí)現(xiàn)嚴(yán)重依賴于具體硬件,在嵌入式系統(tǒng)中硬件配置千差萬別,即使是相同的CPU,它的外設(shè)(比如Flash)也可能不同,所以不可 能有一個Bootloader支持所有的CPU、所有的電路板。即使是支持CPU架構(gòu)比較多的U-Boot,也不是一拿來就可以使用的(除非里面的配置剛好與你的板子相同),需要進(jìn)行一些移植。
二、 Bootloader的啟動方式
CPU上電后,會從某個地址開始執(zhí)行。比如MIPS結(jié)構(gòu)的CPU會從0xBFC00000取第一條指令,而ARM結(jié)構(gòu)的CPU則從地址0x0000000 開始。嵌入式單板中,需要把存儲器件ROM或Flash等映射到這個地址,Bootloader就存放在這個地址開始處,這樣一上電就可以執(zhí)行。
在開發(fā)時,通常需要使用各種命令操作Bootloader,一般通過串口來連接PC和開發(fā)板,可以在串口上輸入各種命令、觀察運(yùn)行結(jié)果等。這也只是對開發(fā) 人員才有意義,用戶使用產(chǎn)品時是不用接串口來控制Bootloader的。從這個觀點(diǎn)來看,Bootloader可以分為兩種操作模式 (Operation Mode):
(1)啟動加載(Boot loading)模式。
上電后,Bootloader從板子上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到RAM中運(yùn)行,整個過程并沒有用戶的介入。產(chǎn)品發(fā)布時,Bootloader工作在這種模式下。
(2)下載(Downloading)模式。
在這種模式下,開發(fā)人員可以使用各種命令,通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件(比如內(nèi)核映像、文件系統(tǒng)映像),將它們直接放在內(nèi)存運(yùn)行或是燒入Flash類固態(tài)存儲設(shè)備中。
板子與主機(jī)間傳輸文件時,可以使用串口的xmodem/ymodem/zmodem協(xié)議,它們使用簡單,只是速度比較慢;還可以使用網(wǎng)絡(luò)通過tftp、nfs協(xié)議來傳輸,這時,主機(jī)上要開啟tftp、nfs服務(wù);還有其他方法,比如USB等。
像Blob或U-Boot等這樣功能強(qiáng)大的Bootloader通常同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進(jìn)行切換。比如,U- Boot在啟動時處于正常的啟動加載模式,但是它會延時若干秒(這可以設(shè)置)等待終端用戶按下任意鍵而將U-Boot切換到下載模式。如果在指定時間內(nèi)沒 有用戶按鍵,則U-Boot繼續(xù)啟動Linux內(nèi)核。
15.1.2 Bootloader的結(jié)構(gòu)和啟動過程

1. 概述

在移植之前先了解Bootloader的一些通用概念,對理解它的代碼會有所幫助。
在一個嵌入式Linux系統(tǒng)中,從軟件的角度通常可以分為4個層次:
(1)引導(dǎo)加載程序,包括固化在固件(firmware)中的 boot 代碼(可選)和Bootloader兩大部分。
有些CPU在運(yùn)行Bootloader之前先運(yùn)行一段固化的程序(固件,firmware),比如x86結(jié)構(gòu)的CPU就是先運(yùn)行BIOS中的固件,然后才運(yùn)行硬盤第一個分區(qū)(MBR)中的Bootloader。
在大多嵌入式系統(tǒng)中并沒有固件,Bootloader是上電后執(zhí)行的第一個程序。
(2)Linux內(nèi)核。
特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動參數(shù)。內(nèi)核的啟動參數(shù)可以是內(nèi)核默認(rèn)的,或是由Bootloader傳遞給它的。
(3)文件系統(tǒng)。
包括根文件系統(tǒng)和建立于Flash內(nèi)存設(shè)備之上的文件系統(tǒng)。里面包含了Linux系統(tǒng)能夠運(yùn)行所必需的應(yīng)用程序、庫等,比如可以給用戶提供操作Linux的控制界面的shell程序,動態(tài)連接的程序運(yùn)行時需要的glibc或uClibc庫,等等。
(4)用戶應(yīng)用程序。
特定于用戶的應(yīng)用程序,它們也存儲在文件系統(tǒng)中。有時在用戶應(yīng)用程序和內(nèi)核層之間可能還會包括一個嵌入式圖形用戶界面。常用的嵌入式 GUI 有:Qtopia 和 MiniGUI 等。
顯然,在嵌入系統(tǒng)的固態(tài)存儲設(shè)備上有相應(yīng)的分區(qū)來存儲它們,圖15.1是一個典型的分區(qū)結(jié)構(gòu)。 [[Image:]]
圖15.1 嵌入式Linux系統(tǒng)中的典型分區(qū)結(jié)構(gòu)
“Boot parameters”分區(qū)中存放一些可設(shè)置的參數(shù),比如IP地址、串口波特率、要傳遞給內(nèi)核的命令行參數(shù)等。正常啟動過程中,Bootloader首先 運(yùn)行,然后它將內(nèi)核復(fù)制到內(nèi)存中(也有些內(nèi)核可以在固態(tài)存儲設(shè)備上直接運(yùn)行),并且在內(nèi)存某個固定的地址設(shè)置好要傳遞給內(nèi)核的參數(shù),最后運(yùn)行內(nèi)核。內(nèi)核啟 動之后,它會掛接(mount)根文件系統(tǒng)(“Root filesystem”),啟動文件系統(tǒng)中的應(yīng)用程序。

2. Bootloader的兩個階段

Bootloader的啟動過程啟動過程可以分為單階段(Single Stage)、多階段(Multi-Stage)兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。從固態(tài)存儲設(shè)備上啟動的Bootloader大多都是 2 階段的啟動過程。這從前面的硬件實(shí)驗(yàn)可以很好地理解這點(diǎn):第一階段使用匯編來實(shí)現(xiàn),它完成一些依賴于 CPU 體系結(jié)構(gòu)的初始化,并調(diào)用第二階段的代碼。第二階段則通常使用C語言來實(shí)現(xiàn),這樣可以實(shí)現(xiàn)更復(fù)雜的功能,而且代碼會有更好的可讀性和可移植性。
一般而言,這兩個階段完成的功能可以如下分類,但這不是絕對的:
(1)Bootloader第一階段的功能。
硬件設(shè)備初始化。
為加載Bootloader的第二階段代碼準(zhǔn)備RAM空間。
拷貝Bootloader的第二階段代碼到 RAM 空間中。
設(shè)置好棧。
跳轉(zhuǎn)到第二階段代碼的C入口點(diǎn)。

在第一階段進(jìn)行的硬件初始化一般包括:關(guān)閉WATCHDOG、關(guān)中斷、設(shè)置CPU的速度和時鐘頻率、RAM初始化等。這些并不都是必需的,比如S3C2410/S3C2440的開發(fā)板所使用的U-Boot中,就將CPU的速度和時鐘頻率的設(shè)置放在第二階段。
甚至,將第二階段的代碼復(fù)制到RAM空間中也不是必需的,對于NOR Flash等存儲設(shè)備,完全可以在上面直接執(zhí)行代碼,只不過這相比在RAM中執(zhí)行效率大為降低。
(2)Bootloader第二階段的功能。
初始化本階段要使用到的硬件設(shè)備。
檢測系統(tǒng)內(nèi)存映射(memory map)。
將內(nèi)核映像和根文件系統(tǒng)映像從Flash上讀到RAM空間中。
為內(nèi)核設(shè)置啟動參數(shù)。
調(diào)用內(nèi)核。

為了方便開發(fā),至少要初始化一個串口以便程序員與Bootloader進(jìn)行交互。
所謂檢測內(nèi)存映射,就是確定板上使用了多少內(nèi)存,它們的地址空間是什么。由于嵌入式開發(fā)中,Bootloader多是針對某類板子進(jìn)行編寫,所以可以根據(jù)板子的情況直接設(shè)置,不需要考慮可以適用于各類情況的復(fù)雜算法。
Flash上的內(nèi)核映像有可能是經(jīng)過壓縮的,在讀到RAM之后,還需要進(jìn)行解壓。當(dāng)然,對于有自解壓功能的內(nèi)核,不需要Bootloader來解壓。
將根文件系統(tǒng)映像復(fù)制到RAM中,這不是必需的。這取決于是什么類型的根文件系統(tǒng),以及內(nèi)核訪問它的方法。
為內(nèi)核設(shè)置啟動參數(shù)將在下一小節(jié)介紹。
將內(nèi)核存放在適當(dāng)?shù)奈恢煤,直接跳到到它的入口點(diǎn)即可調(diào)用內(nèi)核。調(diào)用內(nèi)核之前,下列條件要滿足:
(1)CPU 寄存器的設(shè)置。
R0=0
R1=機(jī)器類型ID;對于ARM結(jié)構(gòu)的CPU,其機(jī)器類型ID可以參見 linux/arch/arm/tools/mach-types。
R2=啟動參數(shù)標(biāo)記列表在 RAM 中起始基地址

(2)CPU工作模式。
必須禁止中斷(IRQs和FIQs)
CPU 必須 SVC 模式

(3)Cache 和 MMU 的設(shè)置。
MMU 必須關(guān)閉
指令 Cache 可以打開也可以關(guān)閉
數(shù)據(jù) Cache 必須關(guān)閉

如果用C語言,可以像下列示例代碼一樣來調(diào)用內(nèi)核:
void (*theKernel)(int zero, int arch, u32 params_addr) = (void (*)(int, int, u32))KERNEL_RAM_BASE; …… theKernel(0, ARCH_NUMBER, (u32) kernel_params_start);

3. Bootloader與內(nèi)核的交互

Bootloader與內(nèi)核的交互是單向的,Bootloader將各類參數(shù)傳給內(nèi)核。由于它們不能同時運(yùn)行,傳遞辦法只有一個:Bootloader將參數(shù)放在某個約定的地方之后,再啟動內(nèi)核,內(nèi)核啟動后從這個地方獲得參數(shù)。
除了約定好參數(shù)存放的地址外,還要規(guī)定參數(shù)的結(jié)構(gòu)。Linux 2.4.x 以后的內(nèi)核都期望以標(biāo)記列表(tagged list)的形式來傳遞啟動參數(shù)。標(biāo)記,就是一種數(shù)據(jù)結(jié)構(gòu);標(biāo)記列表,就是挨著存放的多個標(biāo)記。標(biāo)記列表以標(biāo)記ATAG_CORE 開始,以標(biāo)記ATAG_NONE 結(jié)束。標(biāo)記的數(shù)據(jù)結(jié)構(gòu)為tag,它由一個tag_header結(jié)構(gòu)和一個聯(lián)合(union)組成。tag_header結(jié)構(gòu)表示標(biāo)記的類型及長度,比如是 表示內(nèi)存還是表示命令行參數(shù)等。對于不同類型的標(biāo)記使用不同的聯(lián)合(union),比如表示內(nèi)存時使用tag_mem32,表示命令行時使用 tag_cmdline。數(shù)據(jù)結(jié)構(gòu)tag和tag_header定義在Linux內(nèi)核源碼的include/asm/setup.h頭文件中:
1        struct tag_header { u32 size; u32 tag; };
2        <br>struct tag { struct tag_header hdr; union { struct
3        tag_corecore; struct tag_mem32mem; struct tag_videotextvideotext;
4        struct tag_ramdiskramdisk; struct tag_initrdinitrd; struct
5        tag_serialnrserialnr; struct tag_revisionrevision; struct
6        tag_videolfbvideolfb; struct tag_cmdlinecmdline; <br>struct tag_acornacorn; <br>struct tag_memclkmemclk; } u; };
下面以設(shè)置內(nèi)存標(biāo)記、命令行標(biāo)記為例說明參數(shù)的傳遞:
(1)設(shè)置標(biāo)記 ATAG_CORE。
標(biāo)記列表以標(biāo)記 ATAG_CORE開始,假設(shè)Bootloader與內(nèi)核約定的參數(shù)存放地址為0x30000100,則可以以如下代碼設(shè)置標(biāo)記 ATAG_CORE:
params = (struct tag *) 0x30000100;
       params->hdr.tag = ATAG_CORE;
params->hdr.size = tag_size (tag_core);
params->u.core.flags = 0;
       params->u.core.pagesize = 0;
params->u.core.rootdev = 0;
       params = tag_next (params);
其中,tag_next定義如下,它指向當(dāng)前標(biāo)記的末尾:
#define tag_next(t)((struct tag *)((u32 *)(t) + (t)->hdr.size))
(2)設(shè)置內(nèi)存標(biāo)記。
假設(shè)開發(fā)板使用的內(nèi)存起始地址為0x30000000,大小為0x4000000,則內(nèi)存標(biāo)記可以如下設(shè)置:
params->hdr.tag = ATAG_MEM;
params->hdr.size = tag_size (tag_mem32);
params->u.mem.start = 0x30000000;
params->u.mem.size = 0x4000000;
params = tag_next (params);
(3)設(shè)置命令行標(biāo)記。
命令行就是一個字符串,它被用來控制內(nèi)核的一些行為。比如"root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"表示根文件系統(tǒng)在MTD2分區(qū)上,系統(tǒng)啟動后執(zhí)行的第一個程序?yàn)?linuxrc,控制臺為ttySAC0(即第一個串口)。
命令行可以在Bootloader中通過命令設(shè)置好,然后如下構(gòu)造標(biāo)記傳給內(nèi)核:
char *p = "root=/dev/mtdblock2 init=/linuxrc console=ttySAC0";
params->hdr.tag = ATAG_CMDLINE;
params->hdr.size = (sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;
strcpy (params->u.cmdline.cmdline, p);
params = tag_next (params);
(4)設(shè)置標(biāo)記ATAG_NONE。
標(biāo)記列表以標(biāo)記ATAG_NONE結(jié)束,如下設(shè)置:
params->hdr.tag = ATAG_NONE;
params->hdr.size = 0;
常用Bootloader介紹
現(xiàn)在Bootloader種類繁多,比如x86上有LILO、GRUB等。對于ARM架構(gòu)的CPU,有U-Boot、Vivi等。它們各有特點(diǎn),下面列出Linux的開放源代碼的Bootloader及其支持的體系架構(gòu),如表15.1所示。
開放源碼的Linux引導(dǎo)程序

Bootloader        Monitor        描述        X86        ARM        PowerPC
LILO        否        Linux磁盤引導(dǎo)程序        是        否        否
GRUB        否        GNU的LILO替代程序        是        否        否
Loadlin        否        從DOS引導(dǎo)Linux        是        否        否
ROLO        否        從ROM引導(dǎo)Linux而不需要BIOS        是        否        否
Etherboot        否        通過以太網(wǎng)卡啟動Linux系統(tǒng)的固件        是        否        否
LinuxBIOS        否        完全替代BUIS的Linux引導(dǎo)程序        是        否        否
BLOB        是        LART等硬件平臺的引導(dǎo)程序        否        是        否
U-Boot        是        通用引導(dǎo)程序        是        是        是
RedBoot        是        基于eCos的引導(dǎo)程序        是        是        是
Vivi        是        Mizi公司針對SAMSUNG的ARM CPU設(shè)計(jì)的引導(dǎo)程序        否        是        否

對于本書使用的S3C2410/S3C2440開發(fā)板,U-Boot和Vivi是兩個好選擇。Vivi是Mizi公司針對SAMSUNG的ARM架構(gòu) CPU專門設(shè)計(jì)的,基本上可以直接使用,命令簡單方便。不過其初始版本只支持串口下載,速度較慢。在網(wǎng)上出現(xiàn)了各種改進(jìn)版本:支持網(wǎng)絡(luò)功能、USB功能、 燒寫YAFFS文件系統(tǒng)映像等。U-Boot則支持大多CPU,可以燒寫EXT2、JFFS2文件系統(tǒng)映像,支持串口下載、網(wǎng)絡(luò)下載,并提供了大量的命 令。相對于Vivi,它的使用更復(fù)雜,但是可以用來更方便地調(diào)試程序。

論壇徽章:
12
數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2015-07-08 22:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-05-01 06:20:00IT運(yùn)維版塊每周發(fā)帖之星
日期:2016-03-07 16:27:44IT運(yùn)維版塊每月發(fā)帖之星
日期:2016-03-07 16:25:25IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-02-21 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-02-20 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-02-06 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-30 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2016-01-03 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-11-29 06:20:00IT運(yùn)維版塊每日發(fā)帖之星
日期:2015-08-10 06:20:00數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-06-16 06:20:00
2 [報告]
發(fā)表于 2016-06-28 17:31 |只看該作者
膜拜一下牛人!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP