![嵌入式系統(tǒng)Bootloader_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-4/24/2dd91012-17e4-4231-8109-4490009e310f/2dd91012-17e4-4231-8109-4490009e310f1.gif)
![嵌入式系統(tǒng)Bootloader_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-4/24/2dd91012-17e4-4231-8109-4490009e310f/2dd91012-17e4-4231-8109-4490009e310f2.gif)
![嵌入式系統(tǒng)Bootloader_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-4/24/2dd91012-17e4-4231-8109-4490009e310f/2dd91012-17e4-4231-8109-4490009e310f3.gif)
![嵌入式系統(tǒng)Bootloader_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-4/24/2dd91012-17e4-4231-8109-4490009e310f/2dd91012-17e4-4231-8109-4490009e310f4.gif)
![嵌入式系統(tǒng)Bootloader_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-4/24/2dd91012-17e4-4231-8109-4490009e310f/2dd91012-17e4-4231-8109-4490009e310f5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、嵌入式系統(tǒng)的嵌入式系統(tǒng)的BootloaderBootloader 宿主機(jī)宿主機(jī)- -目標(biāo)機(jī)開(kāi)發(fā)模式目標(biāo)機(jī)開(kāi)發(fā)模式 JTAG 并口并口/串口串口 l嵌入式Linux系統(tǒng)從整體上講,可以分為五大部分 Bootloader(引導(dǎo)加載程序) Kernel(內(nèi)核) Device drivers(驅(qū)動(dòng)程序) (文件系統(tǒng)) Applications(應(yīng)用程序) 從軟件的角度看可以分為四個(gè)層次: 1. 引導(dǎo)加載程序。 包括固化在固件中的 boot 代碼(可選),和 Boot Loader 兩大部分。 2. Linux 內(nèi)核。 特定于嵌入式板子的定制內(nèi)核(包括驅(qū)動(dòng)程序)以及內(nèi)核的 啟動(dòng)參數(shù)。 3. 文件系統(tǒng)。
2、建立于 Flash 設(shè)備之上文件系統(tǒng)。 4. 用戶應(yīng)用程序。 特定于用戶的應(yīng)用程序。有時(shí)在用戶應(yīng)用程序和內(nèi)核層之 間,可能還會(huì)包括一個(gè)嵌入式圖形用戶界面。常用的嵌入 式 GUI有:MicroWindows 和 MiniGUI 。 BootloaderBootloader和嵌入式和嵌入式LinuxLinux 構(gòu)建嵌入式構(gòu)建嵌入式LinuxLinux系統(tǒng)的主要任務(wù)系統(tǒng)的主要任務(wù) l內(nèi)核部分 內(nèi)核裁剪編譯 底層驅(qū)動(dòng)開(kāi)發(fā) l應(yīng)用程序部分 構(gòu)建基本的嵌入式Linux文件系統(tǒng) 應(yīng)用程序開(kāi)發(fā)與移植 嵌入式嵌入式LinuxLinux系統(tǒng)的開(kāi)發(fā)流程系統(tǒng)的開(kāi)發(fā)流程 l建立交叉編譯環(huán)境 lBootloader開(kāi)發(fā)
3、lLinux內(nèi)核的裁剪 l構(gòu)造根文件系統(tǒng) l驅(qū)動(dòng)移植/開(kāi)發(fā) l應(yīng)用程序移植開(kāi)發(fā)和調(diào)試 BootloaderBootloader分類分類 lBootLoader LILO GRUB U-BOOT vivi BootloaderBootloader的通用性質(zhì)的通用性質(zhì) lBootloader與嵌入式Linux的關(guān)系 一個(gè)嵌入式系統(tǒng)從軟件角度來(lái)看分為四個(gè)層次: 1.引導(dǎo)加載程序。包括固化在固件(firmware)中 的 boot 代碼(可選),和 Bootloader 兩大部分。 2. Linux 內(nèi)核。特定于嵌入式板子的定制內(nèi)核以 及內(nèi)核的啟動(dòng)參數(shù)。 3. 文件系統(tǒng)。包括根文件系統(tǒng)和建立于 Fla
4、sh 內(nèi)存設(shè)備之上文件系統(tǒng)。通常用 ram disk 來(lái)作為 root 。 4. 用戶應(yīng)用程序。特定于用戶的應(yīng)用程序。 l引導(dǎo)加載程序是系統(tǒng)加電后運(yùn)行的第一段軟件代 碼?;貞浺幌?PC 的體系結(jié)構(gòu)我們可以知道,PC 機(jī)中的引導(dǎo)加載程序由 BIOS(其本質(zhì)就是一段固 件程序)和位于硬盤 MBR 中的 OS Bootloader (比如,LILO 和 GRUB 等)一起組成。BIOS 在 完成硬件檢測(cè)和資源分配后,將硬盤 MBR 中的 Bootloader 讀到系統(tǒng)的 RAM 中,然后將控制權(quán) 交給 OS Bootloader。Bootloader 的主要運(yùn)行任 務(wù)就是將內(nèi)核映象從硬盤上讀到 RA
5、M 中,然后跳 轉(zhuǎn)到內(nèi)核的入口點(diǎn)去運(yùn)行,也即開(kāi)始啟動(dòng)作系統(tǒng)。 l 而在嵌入式系統(tǒng)中,通常并沒(méi)有像 BIOS 那 樣的固件程序(注,有的嵌入式 CPU 也會(huì)內(nèi) 嵌一段短小的啟動(dòng)程序),因此整個(gè)系統(tǒng)的加 載啟動(dòng)任務(wù)就完全由 Bootloader 來(lái)完成。比 如在一個(gè)基于 ARM7TDMI core 的嵌入式系統(tǒng) 中,系統(tǒng)在上電或復(fù)位時(shí)通常都從地址 0 x00000000 處開(kāi)始執(zhí)行,而在這個(gè)地址處安 排的通常就是系統(tǒng)的 Bootloader 程序。 lBootloader 的概念 簡(jiǎn)單地說(shuō),Bootloader 就是在操作系統(tǒng)內(nèi)核運(yùn)行 之前運(yùn)行的一段小程序。通過(guò)這段小程序,我們可 以初始化硬件設(shè)備
6、、建立內(nèi)存空間的映射圖,從而 將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便為 最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境。 Bootloader 的主要運(yùn)行任務(wù)就是將內(nèi)核映象從硬 盤上讀到 RAM中,然后跳轉(zhuǎn)到內(nèi)核的入口點(diǎn)去運(yùn)行, 也即開(kāi)始啟動(dòng)操作系統(tǒng)。 通常,Bootloader 是嚴(yán)重地依賴于硬件而實(shí)現(xiàn) 的,特別是在嵌入式世界。因此,在嵌入式世界里 建立一個(gè)通用的 Bootloader 幾乎是不可能的。 Bootloader Bootloader 所支持的所支持的 CPU CPU 和嵌入式板和嵌入式板 l每種不同的 CPU 體系結(jié)構(gòu)都有不同的 Bootloader。 有些 Bootloader 也
7、支持多種體系結(jié)構(gòu)的 CPU,比如 U-Boot 就同時(shí)支持 ARM 體系結(jié)構(gòu)和MIPS 體系結(jié)構(gòu)。 除了依賴于 CPU 的體系結(jié)構(gòu)外,Bootloader 實(shí)際上 也依賴于具體的嵌入式板級(jí)設(shè)備的配置。這也就是說(shuō), 對(duì)于兩塊不同的嵌入式板而言,即使它們是基于同一 種 CPU 而構(gòu)建的,要想讓運(yùn)行在一塊板子上的 Bootloader 程序也能運(yùn)行在另一塊板子上,通常也 都需要修改Bootloader 的源程序。 Bootloader 的安裝媒介 系統(tǒng)加電或復(fù)位后,所有的 CPU 通常都從某個(gè)由 CPU 制造商預(yù)先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在復(fù)位時(shí)通常都
8、從地址 0 x00000000 取它的第 一條指令。 一個(gè)同時(shí)裝有 Bootloader、內(nèi)核的啟動(dòng)參數(shù)、內(nèi)核映像 和根文件系統(tǒng)映像的固態(tài)存儲(chǔ)設(shè)備的典型空間分配結(jié)構(gòu)圖 : 用來(lái)控制用來(lái)控制 Bootloader Bootloader 的設(shè)備或機(jī)制的設(shè)備或機(jī)制 l主機(jī)和目標(biāo)機(jī)之間一般通過(guò)串口建立連接, Bootloader 軟件在執(zhí)行時(shí)通常會(huì)通過(guò)串口來(lái) 進(jìn)行 I/O,比如:輸出打印信息到串口,從串 口讀取用戶控制字符等。 lBootloader 的主要任務(wù)與典型結(jié)構(gòu)框架 Bootloader 的啟動(dòng)過(guò)程可分為單階段(Single Stage)和多階段(Multi-Stage)兩種。 通常多階段的
9、 Bootloader 能提供更為復(fù)雜的功 能,以及更好的可移植性。從固態(tài)存儲(chǔ)設(shè)備上啟動(dòng) 的 Bootloader 大多都是兩階段的啟動(dòng)過(guò)程,也即 啟動(dòng)過(guò)程可以分為stage 1和 stage 2 兩部分。 stage1通常用匯編語(yǔ)言實(shí)現(xiàn),完成初始化硬件, 為stage2準(zhǔn)備內(nèi)存空間,將stage2復(fù)制到內(nèi)存中, 設(shè)置堆棧,然后跳轉(zhuǎn)到stage2的程序入口。 stage2通常用C語(yǔ)言完成,使得程序有更好的可 讀性與可移植性。主要任務(wù)包括:初始化本階段要 用到的硬件設(shè)備,檢測(cè)內(nèi)存,將操作系統(tǒng)的內(nèi)核與 根文件系統(tǒng)從Flash讀到RAM中,設(shè)置內(nèi)核啟動(dòng)參數(shù), 最后調(diào)用內(nèi)核。 Bootloader B
10、ootloader 的操作模式的操作模式 (Operation Mode)(Operation Mode) l大多數(shù) Bootloader 都包含兩種不同的操作模式 “啟動(dòng)加載”模式 “下載”模式 l這種區(qū)別僅對(duì)于開(kāi)發(fā)人員才有意義。但從最終用 戶的角度看,Bootloader 的作用就是用來(lái)加載 操作作系統(tǒng),而并不存在所謂的啟動(dòng)加載模式與 下載工作模式的區(qū)別。 啟動(dòng)加載(啟動(dòng)加載(Boot loadingBoot loading)模式)模式 l這種模式也稱為“自主”(Autonomous)模式。也 即 Bootloader 從目標(biāo)機(jī)上的某個(gè)固態(tài)存儲(chǔ)設(shè)備上 將操作系統(tǒng)加載到 RAM 中運(yùn)行,整個(gè)
11、過(guò)程并沒(méi)有用 戶的介入。這種模式是 Bootloader 的正常工作模 式,因此在嵌入式產(chǎn)品發(fā)布的時(shí)侯,Bootloader 顯 然必須工作在這種模式下。 下載(下載(DownloadingDownloading)模式)模式 l在這種模式下,目標(biāo)機(jī)上的 Bootloader 將通過(guò)串 口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載 文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。 從主機(jī)下載的文件通常首先被 Bootloader 保存到 目標(biāo)機(jī)的 RAM 中,然后再被 Bootloader 寫到目 標(biāo)機(jī)上的FLASH 類固態(tài)存儲(chǔ)設(shè)備中。 lBootloader 的這種模式通常在第一次安裝內(nèi)核 與
12、根文件系統(tǒng)時(shí)被使用;此外,以后的系統(tǒng)更 新也會(huì)使用 Bootloader 的這種工作模式。工 作于這種模式下的 Bootloader 通常都會(huì)向它 的終端用戶提供一個(gè)簡(jiǎn)單的命令行接口。 l像 Blob 或 U-Boot 等這樣功能強(qiáng)大的 Bootloader 通常同時(shí)支持這兩種工作模式,而且允許用戶在這 兩種工作模式之間進(jìn)行切換。比如,Blob 在啟動(dòng)時(shí) 處于正常的啟動(dòng)加載模式,但是它會(huì)延時(shí) 10 秒等 待終端用戶按下任意鍵而將 blob 切換到下載模式。 如果在 10 秒內(nèi)沒(méi)有用戶按鍵,則 blob 繼續(xù)啟動(dòng) Linux 內(nèi)核。 BootLoader BootLoader 與主機(jī)之間進(jìn)行文件
13、傳輸所用與主機(jī)之間進(jìn)行文件傳輸所用 的通信設(shè)備及協(xié)議的通信設(shè)備及協(xié)議 l最常見(jiàn)的情況就是,目標(biāo)機(jī)上的 Bootloader 通過(guò)串口 與主機(jī)之間進(jìn)行文件傳輸,傳輸協(xié)議通常是 xmodem ymodemzmodem 協(xié)議中的一種。但是,串口傳 輸?shù)乃俣仁怯邢薜?,因此通過(guò)以太網(wǎng)連接并借助 TFTP 協(xié)議來(lái)下載文件是個(gè)更好的選擇。 l此外,主機(jī)方所用的軟件也要考慮。比如,在通過(guò)以 太網(wǎng)連接和 TFTP 協(xié)議來(lái)下載文件時(shí),主機(jī)方必須有 一個(gè)軟件用來(lái)提供 TFTP 服務(wù)。 Bootloader Bootloader 的主要任務(wù)與典型結(jié)構(gòu)框架的主要任務(wù)與典型結(jié)構(gòu)框架 l首先我們做一個(gè)假定,那就是:假定內(nèi)核
14、映像與 根文件系統(tǒng)映像都被加載到 RAM 中運(yùn)行。之所 以提出這樣一個(gè)假設(shè)前提是因?yàn)?,在嵌入式系統(tǒng) 中內(nèi)核映像與根文件系統(tǒng)映像也可以直接在 ROM 或 Flash 這樣的固態(tài)存儲(chǔ)設(shè)備中直接運(yùn)行。 但這種做法無(wú)疑是以運(yùn)行速度的犧牲為代價(jià)的。 從操作系統(tǒng)的角度看,Bootloader 的總目標(biāo)就 是正確地調(diào)用內(nèi)核來(lái)執(zhí)行。 l由于 Bootloader 的實(shí)現(xiàn)依賴于 CPU 的體系結(jié) 構(gòu),因此大多數(shù) Bootloader 都分為 stage1 和 stage2 兩大部分。 l依賴于 CPU 體系結(jié)構(gòu)的代碼,比如設(shè)備初始化 代碼等,通常都放在 stage1 中,而且通常都 用匯編語(yǔ)言來(lái)實(shí)現(xiàn),以達(dá)到短小
15、精悍的目的。 而 stage2 則通常用C語(yǔ)言來(lái)實(shí)現(xiàn),這樣可以實(shí) 現(xiàn)給復(fù)雜的功能,而且代碼會(huì)具有更好的可讀 性和可移植性。 l多階段的 Bootloader Bootloader 的 stage1 通常包括以下步驟(以 執(zhí)行的先后順序): 1.硬件設(shè)備初始化。 2.為加載 Bootloader 的 stage2 準(zhǔn)備 RAM 空 間。 3.拷貝 Bootloader 的 stage2 到 RAM 空間中。 4.設(shè)置好堆棧。 5.跳轉(zhuǎn)到 stage2 的 C 入口點(diǎn)。 Bootloader 的 stage2 通常包括以下步驟(以 執(zhí)行的先后順序): 1.初始化本階段要使用到的硬件設(shè)備。 2.檢測(cè)
16、系統(tǒng)內(nèi)存映射(memory map)。 3.將 kernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中。 4.為內(nèi)核設(shè)置啟動(dòng)參數(shù)。 5.調(diào)用內(nèi)核。 bootloader 的 stage2 可執(zhí)行 映象剛被拷貝 到 RAM 空間 時(shí)的系統(tǒng)內(nèi)存 布局 Bootloader Bootloader 的的 stage1stage1 l基本的硬件初始化 l為加載 stage2 準(zhǔn)備 RAM 空間 l拷貝 stage2 到 RAM 中 基本的硬件初始化基本的硬件初始化 l這是 Bootloader 一開(kāi)始就執(zhí)行的操作,其目 的是為 stage2 的執(zhí)行以及隨后的 kernel 的執(zhí) 行準(zhǔn)備
17、好一些基本的硬件環(huán)境。它通常包括以 下步驟(以執(zhí)行的先后順序) 屏蔽所有的中斷 為中斷提供服務(wù)通常是 OS 設(shè)備驅(qū)動(dòng)程序的責(zé)任, 因此在 Bootloader 的執(zhí)行全過(guò)程中可以不必響應(yīng)任何 中斷。中斷屏蔽可以通過(guò)寫 CPU 的中斷屏蔽寄存器或 狀態(tài)寄存器(比如 ARM 的 CPSR 寄存器)來(lái)完成 設(shè)置 CPU 的速度和時(shí)鐘頻率 RAM 初始化 包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能寄存器以 及各內(nèi)存庫(kù)控制寄存器等 初始化 LED 典型地,通過(guò) GPIO 來(lái)驅(qū)動(dòng) LED,其目的是表明 系統(tǒng)的狀態(tài)是 OK 還是 Error。如果板子上沒(méi)有 LED, 那么也可以通過(guò)初始化 UART 向串口打印 B
18、ootloader 的 Logo 字符信息來(lái)完成這一點(diǎn) 關(guān)閉 CPU 內(nèi)部指令數(shù)據(jù) cache 為加載為加載 stage2 stage2 準(zhǔn)備準(zhǔn)備 RAM RAM 空間空間 l為了獲得更快的執(zhí)行速度,通常把 stage2 加載到 RAM 空間中來(lái)執(zhí)行,因此必須為加載 Bootloader 的 stage2 準(zhǔn)備好一段可用的 RAM 空間范圍。 l由于 stage2 通常是 C 語(yǔ)言執(zhí)行代碼,因此在考慮 空間大小時(shí),除了 stage2 可執(zhí)行映象的大小外, 還必須把堆??臻g也考慮進(jìn)來(lái)。此外,空間大小最 好是 memory page 大小(通常是 4KB)的倍數(shù)。一般 而言,1M 的 RAM 空間
19、已經(jīng)足夠了。具體的地址范 圍可以任意安排,比如 blob 就將它的 stage2 可 執(zhí)行映像安排到從系統(tǒng) RAM 起始地址 0 xc0200000 開(kāi)始的 1M 空間內(nèi)執(zhí)行。但是,將 stage2 安排到 整個(gè) RAM 空間的最頂 1MB(也即(RamEnd-1MB) - RamEnd)是一種值得推薦的方法。 l為了后面的敘述方便,這里把所安排的 RAM 空間范 圍的大小記為:stage2_size(字節(jié)),把起始地址和 終止地址分別記為:stage2_start 和 stage2_end(這兩個(gè)地址均以 4 字節(jié)邊界對(duì)齊)。因 此:stage2_endstage2_startstage2_
20、size l另外,還必須確保所安排的地址范圍的的確確是可 讀寫的 RAM 空間,因此,必須對(duì)你所安排的地址范 圍進(jìn)行測(cè)試。 l以 memory page 為被測(cè)試單位,測(cè)試每個(gè) memory page 開(kāi)始的兩個(gè)字是否是可讀寫的。 為了后面敘述的方便,我們記這個(gè)檢測(cè)算法為: test_mempage,其具體步驟如下: 1先保存 memory page 一開(kāi)始兩個(gè)字的內(nèi)容。 2向這兩個(gè)字中寫入任意的數(shù)字。比如:向第一個(gè)字寫入 0 x55,第 2 個(gè)字寫入 0 xaa。 3然后,立即將這兩個(gè)字的內(nèi)容讀回。顯然,我們讀到的內(nèi) 容應(yīng)該分別是 0 x55 和 0 xaa。如果不是,則說(shuō)明這個(gè) memor
21、y page 所占據(jù)的地址范圍不是一段有效的 RAM 空間。 4再向這兩個(gè)字中寫入任意的數(shù)字。比如:向第一個(gè)字寫入 0 xaa,第 2 個(gè)字中寫入0 x55。 5然后,立即將這兩個(gè)字的內(nèi)容立即讀回。顯然,我們讀到 的內(nèi)容應(yīng)該分別是 0 xaa 和 0 x55。如果不是,則說(shuō)明這個(gè) memory page 所占據(jù)的地址范圍不是一段有效的 RAM 空間。 6恢復(fù)這兩個(gè)字的原始內(nèi)容。測(cè)試完畢。 為了得到一段干凈的 RAM 空間范圍,我們也可以將所安排的 RAM 空間范圍進(jìn)行清零操作。 拷貝拷貝 stage2 stage2 到到 RAM RAM 中中 l 拷貝時(shí)要確定兩點(diǎn): (1) stage2 的可
22、執(zhí)行映象在固態(tài)存儲(chǔ)設(shè)備的存放 起始地址和終止地址; (2) RAM 空間的起始地址 設(shè)置堆棧指針設(shè)置堆棧指針 spsp l堆棧指針的設(shè)置是為了執(zhí)行 C 語(yǔ)言代碼作好準(zhǔn)備。 通常我們可以把 sp 的值設(shè)置為(stage2_end-4), 也即在上面所安排的那個(gè) 1MB 的 RAM 空間的最 頂端(堆棧向下生長(zhǎng))。此外,在設(shè)置堆棧指針 sp 之前,也可以關(guān)閉 led 燈,以提示用戶我們準(zhǔn)備 跳轉(zhuǎn)到 stage2。 跳轉(zhuǎn)到跳轉(zhuǎn)到 stage2 stage2 的的 C C 入口點(diǎn)入口點(diǎn) l在上述一切都就緒后,就可以跳轉(zhuǎn)到 Bootloader 的 stage2 去執(zhí)行了。比如,在 ARM 系統(tǒng)中,這
23、可以通過(guò)修改 PC 寄存器為合適的地址來(lái)實(shí)現(xiàn)。 Bootloader Bootloader 的的 stage2stage2 l正如前面所說(shuō),stage2 的代碼通常用 C 語(yǔ)言來(lái) 實(shí)現(xiàn),以便于實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代 碼可讀性和可移植性。但是與普通 C 語(yǔ)言應(yīng)用 程序不同的是,在編譯和鏈接Bootloader 這樣 的程序時(shí),我們不能使用 glibc 庫(kù)中的任何支 持函數(shù)。 初始化本階段要使用到的硬件設(shè)備初始化本階段要使用到的硬件設(shè)備 l通常包括: (1)初始化至少一個(gè)串口,以便和終端用戶 進(jìn)行 I/O 輸出信息; (2)初始化計(jì)時(shí)器等。在初始化這些設(shè)備之 前,也可以重新把 LED 燈點(diǎn)
24、亮,以表明我們 已經(jīng)進(jìn)入 main() 函數(shù)執(zhí)行。 l設(shè)備初始化完成后,可以輸出一些打印信息, 程序名字字符串、版本號(hào)等。 檢測(cè)系統(tǒng)的內(nèi)存映射(檢測(cè)系統(tǒng)的內(nèi)存映射(memory mapmemory map) l所謂內(nèi)存映射就是指在整個(gè) 4GB 物理地址空 間中有哪些地址范圍被分配用來(lái)尋址系統(tǒng)的 RAM 單元。比如,在 Samsung S3C44B0X CPU 中,從 0 x0c00,0000 到 0 x1000,0000 之 間的 64M 地址空間被用作系統(tǒng)的 RAM 地址 空間。 l雖然 CPU 通常預(yù)留出一大段足夠的地址空間給 系統(tǒng) RAM,但是在搭建具體的嵌入式系統(tǒng)時(shí)卻 不一定會(huì)實(shí)現(xiàn) C
25、PU 預(yù)留的全部RAM 地址空間。 也就是說(shuō),具體的嵌入式系統(tǒng)往往只把 CPU 預(yù) 留的全部 RAM 地址空間中的一部分映射到 RAM 單元上,而讓剩下的那部分預(yù)留 RAM 地址空間 處于未使用狀態(tài)。 l由于上述這個(gè)事實(shí),因此 Bootloader 的 stage2 必須在它想干點(diǎn)什么 (比如,將存儲(chǔ)在 flash 上 的內(nèi)核映像讀到 RAM 空間中) 之前檢測(cè)整個(gè)系 統(tǒng)的內(nèi)存映射情況,也即它必須知道 CPU 預(yù)留 的全部 RAM 地址空間中的哪些被真正映射到 RAM 地址單元,哪些是處于 unused 狀態(tài)的。 內(nèi)存映射的描述內(nèi)存映射的描述 l可以用如下數(shù)據(jù)結(jié)構(gòu)來(lái)描述 RAM 地址空間中的一
26、段連續(xù) (continuous)的地址范圍 typedef struct memory_area_struct u32 start; /* the base address of the memory region */ u32 size; /* the byte number of the memory region */ int used; memory_area_t; 這段 RAM 地址空間中的連續(xù)地址范圍可以處于兩種狀態(tài)之一: (1)used=1,則說(shuō)明這段連續(xù)的地址范圍已被實(shí)現(xiàn), 也即真正地被映射到 RAM 單元上。 (2)used=0,則說(shuō)明這段連續(xù)的地址范圍并未被系統(tǒng)所實(shí)現(xiàn), 而
27、是處于未使用狀態(tài) l基于上述 memory_area_t 數(shù)據(jù)結(jié)構(gòu),整個(gè) CPU 預(yù)留的 RAM 地址空間可以用一個(gè) memory_area_t 類型的數(shù)組來(lái) 表示,如下所示: memory_area_t memory_mapNUM_MEM_AREAS = 0 . (NUM_MEM_AREAS - 1) = .start = 0, .size = 0, .used = 0 , ; 內(nèi)存映射的檢測(cè)內(nèi)存映射的檢測(cè) l一個(gè)可用來(lái)檢測(cè)整個(gè) RAM 地址空間內(nèi)存映射情 況的簡(jiǎn)單而有效的算法 。在用這個(gè)算法檢測(cè)完 系統(tǒng)的內(nèi)存映射情況后,Bootloader 也可以將內(nèi) 存映射的詳細(xì)信息打印到串口 加載內(nèi)核
28、映像和根文件系統(tǒng)映像加載內(nèi)核映像和根文件系統(tǒng)映像 l規(guī)劃內(nèi)存占用的布局 l從 Flash 上拷貝 規(guī)劃內(nèi)存占用的布局規(guī)劃內(nèi)存占用的布局 l這里包括兩個(gè)方面: (1)內(nèi)核映像所占用的內(nèi)存范圍; (2)根文件系統(tǒng)所占用的內(nèi)存范圍。在規(guī)劃內(nèi)存占用的布局 時(shí),主要考慮基地址和映像的大小兩個(gè)方面。 l對(duì)于內(nèi)核映像,一般將其拷貝到從(MEM_START0 x8000) 這 個(gè)基地址開(kāi)始的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式 Linux 的內(nèi)核一般都不操過(guò) 1MB)。為什么要把從 MEM_START 到 MEM_START0 x8000 這段 32KB 大小的內(nèi)存空出來(lái)呢?這是 因?yàn)?Linux 內(nèi)核要在這段
29、內(nèi)存中放置一些全局?jǐn)?shù)據(jù)結(jié)構(gòu), 如:?jiǎn)?dòng)參數(shù)和內(nèi)核頁(yè)表等信息。 l而對(duì)于根文件系統(tǒng)映像,則一般將其拷貝到 MEM_START+0 x0010,0000 開(kāi)始的地方。如果用 Ramdisk 作 為根文件系統(tǒng)映像,則其解壓后的大小一般是1MB。 從從 Flash Flash 上拷貝上拷貝 l由于像 ARM 這樣的嵌入式 CPU 通常都是在統(tǒng)一 的內(nèi)存地址空間中尋址 Flash 等固態(tài)存儲(chǔ)設(shè)備的, 因此從 Flash 上讀取數(shù)據(jù)與從 RAM 單元中讀取 數(shù)據(jù)并沒(méi)有什么不同。用一個(gè)簡(jiǎn)單的循環(huán)就可以 完成從 Flash 設(shè)備上拷貝映像的工作 while(count) *dest+ = *src+; /* they are all aligned with word boundary */ count -= 4; /* byte number */ ; 設(shè)置內(nèi)核的啟動(dòng)參數(shù)設(shè)置內(nèi)核的啟動(dòng)參數(shù) l應(yīng)該說(shuō),在將內(nèi)核映像和根文件系統(tǒng)映像拷貝 到 RAM 空間中后,就可以準(zhǔn)備啟動(dòng) Linux 內(nèi) 核了。但是在調(diào)用內(nèi)核之前,應(yīng)該作一步準(zhǔn)備 工作,即設(shè)置 Linux 內(nèi)核的啟動(dòng)參數(shù)。 調(diào)用內(nèi)核調(diào)用內(nèi)核 lBootloader 調(diào)用 Linux 內(nèi)核的方法是直接跳轉(zhuǎn) 到內(nèi)核的第一條指令處,也即直接跳轉(zhuǎn)到 MEM_START0 x8000 地址處。 l在跳轉(zhuǎn)時(shí),下
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 環(huán)保理念下的現(xiàn)代家居設(shè)計(jì)風(fēng)格
- 現(xiàn)代飲食文化與胃腸健康的平衡
- 生產(chǎn)環(huán)境下的操作規(guī)范與質(zhì)量控制
- 現(xiàn)代企業(yè)網(wǎng)絡(luò)攻擊的防范與應(yīng)對(duì)
- 現(xiàn)代企業(yè)決策分析與科學(xué)決策
- 2023三年級(jí)語(yǔ)文下冊(cè) 第八單元 口語(yǔ)交際:趣味故事會(huì)配套說(shuō)課稿 新人教版
- Unit5 Humans and nature Lesson 1 A sea story 說(shuō)課稿-2024-2025學(xué)年高中英語(yǔ)北師大版(2019)必修第二冊(cè)001
- 2024-2025學(xué)年新教材高中數(shù)學(xué) 第五章 三角函數(shù) 5.7 三角函數(shù)的應(yīng)用(2)說(shuō)課稿 新人教A版必修第一冊(cè)
- 2023八年級(jí)數(shù)學(xué)下冊(cè) 第18章 平行四邊形18.1 平行四邊形的性質(zhì)第2課時(shí) 平行四邊形的性質(zhì)定理3說(shuō)課稿 (新版)華東師大版
- 2023二年級(jí)語(yǔ)文上冊(cè) 第二單元 2 樹(shù)之歌配套說(shuō)課稿 新人教版
- (人衛(wèi)版第九版?zhèn)魅静W(xué)總論(一))課件
- 壓力性損傷護(hù)理質(zhì)控細(xì)則及集束化管理措施
- 《批判性思維原理和方法》全套教學(xué)課件
- 產(chǎn)后康復(fù)-腹直肌分離
- 丙烯-危險(xiǎn)化學(xué)品安全周知卡
- 粉條加工廠建設(shè)項(xiàng)目可行性研究報(bào)告
- 《配電網(wǎng)設(shè)施可靠性評(píng)價(jià)指標(biāo)導(dǎo)則》
- 2024年國(guó)家電網(wǎng)招聘之通信類題庫(kù)附參考答案(考試直接用)
- CJJ 169-2012城鎮(zhèn)道路路面設(shè)計(jì)規(guī)范
- 食品企業(yè)日管控周排查月調(diào)度記錄及其報(bào)告格式參考
- 產(chǎn)品質(zhì)量法解讀課件1
評(píng)論
0/150
提交評(píng)論