版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式與ARM體系構(gòu)造總結(jié)ARM匯編程序設(shè)計 掌握ARM匯編規(guī)范掌握ARM指令的匯編程序設(shè)計 掌握匯編言語與C言語的混合編程5ARM初始化過程分析第章本章目的了解ARM初始化過程熟習(xí)BootLoader的實現(xiàn)原理認(rèn)識Bootloader的主要義務(wù) 熟習(xí)BootLoader的構(gòu)造框架5.1 引言 本章詳細(xì)地引見了基于嵌入式系統(tǒng)中的 OS 啟動加載程序Boot Loader 的概念、軟件設(shè)計的主要義務(wù)以及構(gòu)造框架等內(nèi)容 。一個嵌入式 Linux 系統(tǒng)從軟件的角度看通??梢苑譃樗膫€層次: 1. 引導(dǎo)加載程序。包括固化在固件(firmware)中的 boot 代碼(可選),和 Boot Loader
2、兩大部分。2. Linux 內(nèi)核。特定于嵌入式板子的定制內(nèi)核以及內(nèi)核的啟動參數(shù)。 3. 文件系統(tǒng)。包括根文件系統(tǒng)和建立于 Flash 內(nèi)存設(shè)備之上文件系統(tǒng)。通常用 ram disk 來作為 root fs。 4. 用戶運用程序。特定于用戶的運用程序。有時在用戶運用程序和內(nèi)核層之間能夠還會包括一個嵌入式圖形用戶界面。常用的嵌入式 GUI 有:MicroWindows 和 MiniGUI 。引導(dǎo)加載程序是系統(tǒng)加電后運轉(zhuǎn)的第一段軟件代碼?;叵胍幌?PC 的體系構(gòu)造我們可以知道,PC 機(jī)中的引導(dǎo)加載程序由 BIOS(其本質(zhì)就是一段固件程序)和位于硬盤 MBR 中的 OS Boot Loader比如,L
3、ILO 和 GRUB 等一同組成。BIOS 在完成硬件檢測和資源分配后,將硬盤 MBR 中的 Boot Loader 讀到系統(tǒng)的 RAM 中,然后將控制權(quán)交給 OS Boot Loader。Boot Loader 的主要運轉(zhuǎn)義務(wù)就是將內(nèi)核映象從硬盤上讀到 RAM 中,然后跳轉(zhuǎn)到內(nèi)核的入口點去運轉(zhuǎn),也即開場啟動操作系統(tǒng)。 而在嵌入式系統(tǒng)中,通常并沒有像 BIOS 那樣的固件程序注,有的嵌入式 CPU 也會內(nèi)嵌一段短小的啟動程序,因此整個系統(tǒng)的加載啟動義務(wù)就完全由 Boot Loader 來完成。比如在一個基于 ARM7TDMI core 的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時通常都從地址 0 x00
4、000000 處開場執(zhí)行,而在這個地址處安排的通常就是系統(tǒng)的 Boot Loader 程序。 5.1 引言5.1 引言系統(tǒng)的啟動通常有兩種方式,一種是可以直接從Flash啟動,另一種是可以將緊縮的內(nèi)存映像文件從Flash為節(jié)省Flash資源、提高速度中復(fù)制、解壓到RAM,再從RAM啟動。當(dāng)電源翻開時,普通的系統(tǒng)會去執(zhí)行ROM運用較多的是Flash里面的啟動代碼。這些代碼是用匯編言語編寫的,其主要作用在于初始化CPU和板上的必備硬件如內(nèi)存、中斷控制器等。有時候用戶還必需根據(jù)本人板子的硬件資源情況做適當(dāng)?shù)恼{(diào)整與修正。 系統(tǒng)啟動代碼完成根本軟硬件環(huán)境初始化后,對于有操作系統(tǒng)的情況下,啟動操作系統(tǒng)、啟
5、動內(nèi)存管理、義務(wù)調(diào)度、加載驅(qū)動程序等,最后執(zhí)行運用程序或等待用戶命令;對于沒有操作系統(tǒng)的系統(tǒng)直接執(zhí)行運用程序或等待用戶命令。 設(shè)置中斷異常向量系統(tǒng)存放器配置看門狗及外圍電路初始化存儲器電路初始化初始化棧指針變量初始化數(shù)據(jù)區(qū)預(yù)備高級言語入口函數(shù)調(diào)用啟動代碼是用來初始化電路以及用來為高級言語寫的軟件做好運轉(zhuǎn)前預(yù)備的一小段匯編言語,在商業(yè)實時操作系統(tǒng)中,啟動代碼部分普通被稱為板級支持包,英文縮寫為BSP。它的主要功能就是:電路初始化和為高級言語編寫的軟件運轉(zhuǎn)做預(yù)備。右圖:嵌入式系統(tǒng)啟動流程圖5.1 引言 5.2 Bootloader概述 簡單地說,Boot Loader 就是在操作系統(tǒng)內(nèi)核運轉(zhuǎn)之前運
6、轉(zhuǎn)的一段小程序。經(jīng)過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個適宜的形狀,以便為最終調(diào)用操作系統(tǒng)內(nèi)核預(yù)備好正確的環(huán)境。 通常,Boot Loader 是嚴(yán)重地依賴于硬件而實現(xiàn)的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的 Boot Loader 幾乎是不能夠的。雖然如此,我們依然可以對 Boot Loader 歸納出一些通用的概念來,以指點用戶特定的 Boot Loader 設(shè)計與實現(xiàn)。 5.2 Bootloader概述1. Boot Loader 所支持的 CPU 和嵌入式板每種不同的 CPU 體系構(gòu)造都有不同的 Boot Loade
7、r。有些 Boot Loader 也支持多種體系構(gòu)造的 CPU,比如 U-Boot 就同時支持 ARM 體系構(gòu)造和MIPS 體系構(gòu)造。除了依賴于 CPU 的體系構(gòu)造外,Boot Loader 實踐上也依賴于詳細(xì)的嵌入式板級設(shè)備的配置。這也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種 CPU 而構(gòu)建的,要想讓運轉(zhuǎn)在一塊板子上的 Boot Loader 程序也能運轉(zhuǎn)在另一塊板子上,通常也都需求修正 Boot Loader 的源程序。 5.2 Bootloader概述2. Boot Loader 的安裝媒介Installation Medium系統(tǒng)加電或復(fù)位后,一切的 CPU 通常都從某
8、個由 CPU 制造商預(yù)先安排的地址上取指令。比如,基于 ARM7TDMI core 的 CPU 在復(fù)位時通常都從地址 0 x00000000 取它的第一條指令。而基于 CPU 構(gòu)建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設(shè)備(比如:ROM、EEPROM 或 FLASH 等)被映射到這個預(yù)先安排的地址上。因此在系統(tǒng)加電后,CPU 將首先執(zhí)行 Boot Loader 程序。 以下圖就是一個同時裝有 Boot Loader、內(nèi)核的啟動參數(shù)、內(nèi)核映像和根文件系統(tǒng)映像的固態(tài)存儲設(shè)備的典型空間分配構(gòu)造圖。 KernelRoot FilesystemBootLoaderBoot Parameters 5.2
9、Bootloader概述3. 用來控制 Boot Loader 的設(shè)備或機(jī)制主機(jī)和目的機(jī)之間普統(tǒng)統(tǒng)過串口建立銜接,Boot Loader 軟件在執(zhí)行時通常會經(jīng)過串口來進(jìn)展 I/O,比如:輸出打印信息到串口,從串口讀取用戶控制字符等。4. Boot Loader 的啟動過程是單階段Single Stage還是多階段Multi-Stage通常多階段的 Boot Loader 能提供更為復(fù)雜的功能,以及更好的可移植性。從固態(tài)存儲設(shè)備上啟動的 Boot Loader 大多都是 2 階段的啟動過程,也即啟動過程可以分為 stage 1 和 stage 2 兩部分。而至于在 stage 1 和 stage
10、 2 詳細(xì)完成哪些義務(wù)將在下面討論。 5.2 Bootloader概述5. Boot Loader 的操作方式 (Operation Mode)大多數(shù) Boot Loader 都包含兩種不同的操作方式:“啟動加載方式和“下載方式,這種區(qū)別僅對于開發(fā)人員才有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統(tǒng),而并不存在所謂的啟動加載方式與下載任務(wù)方式的區(qū)別。 啟動加載Boot loading方式: 這種方式也稱為“自主Autonomous方式。也即 Boot Loader 從目的機(jī)上的某個固態(tài)存儲設(shè)備上將操作系統(tǒng)加載到 RAM 中運轉(zhuǎn),整個過程并沒有用戶的介入。下載D
11、ownloading方式: 在這種方式下,目的機(jī)上的 Boot Loader 將經(jīng)過串口銜接或網(wǎng)絡(luò)銜接等通訊手段從主機(jī)Host下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。 6. BootLoader 與主機(jī)之間進(jìn)展文件傳輸所用的通訊設(shè)備及協(xié)議最常見的情況就是,目的機(jī)上的 Boot Loader 經(jīng)過串口與主機(jī)之間進(jìn)展文件傳輸,傳輸協(xié)議通常是 xmodemymodemzmodem 協(xié)議中的一種。但是,串口傳輸?shù)乃俣仁怯邢薜?,因此?jīng)過以太網(wǎng)銜接并借助 TFTP 協(xié)議來下載文件是個更好的選擇。在經(jīng)過以太網(wǎng)銜接和 TFTP 協(xié)議來下載文件時,主機(jī)方必需有一個軟件用來的提供 TFTP 效力。 5.3
12、 BootLoader的主要義務(wù)與典型構(gòu)造框架假定內(nèi)核映像與根文件系統(tǒng)映像都被加載到 RAM 中運轉(zhuǎn). 另外,由于 Boot Loader 的實現(xiàn)依賴于 CPU 的體系構(gòu)造,因此大多數(shù) Boot Loader 都分為 stage1 和 stage2 兩大部分。依賴于 CPU 體系構(gòu)造的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1 中,而且通常都用匯編言語來實現(xiàn),以到達(dá)短小精悍的目的。而 stage2 那么通常用C言語來實現(xiàn),這樣可以實現(xiàn)給復(fù)雜的功能,而且代碼會具有更好的可讀性和可移植性。 5.3 BootLoader的主要義務(wù)與典型構(gòu)造框架5.3.1 Bootloader的stage1
13、Boot Loader 的 stage1 通常包括以下步驟(以執(zhí)行的先后順序): 1硬件設(shè)備初始化。 2為加載 Boot Loader 的 stage2 預(yù)備 RAM 空間。 3拷貝 Boot Loader 的 stage2 到 RAM 空間中。 4設(shè)置好堆棧。 5跳轉(zhuǎn)到 stage2 的 C 入口點。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架1 根本的硬件初始化 這是 Boot Loader 一開場就執(zhí)行的操作,其目的是為 stage2 的執(zhí)行以及隨后的 kernel 的執(zhí)行預(yù)備好一些根本的硬件環(huán)境。它通常包括以下步驟以執(zhí)行的先后順序: 1.屏蔽一切的中斷。為中斷提供效力通常是 O
14、S 設(shè)備驅(qū)動程序的責(zé)任,因此在 Boot Loader 的執(zhí)行全過程中可以不用呼應(yīng)任何中斷。中斷屏蔽可以經(jīng)過寫 CPU 的中斷屏蔽存放器或形狀存放器比如 ARM 的 CPSR 存放器來完成。 2.設(shè)置 CPU 的速度和時鐘頻率。 3.RAM 初始化。包括正確地設(shè)置系統(tǒng)的內(nèi)存控制器的功能存放器以及各內(nèi)存庫控制存放器等。 4.初始化 LED。典型地,經(jīng)過 GPIO 來驅(qū)動 LED,其目的是闡明系統(tǒng)的形狀是 OK 還是 Error。假設(shè)板子上沒有 LED,那么也可以經(jīng)過初始化 UART 向串口打印 Boot Loader 的 Logo 字符信息來完成這一點。 5.封鎖 CPU 內(nèi)部指令數(shù)據(jù) cach
15、e。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架2 為加載 stage2 預(yù)備 RAM 空間 為了獲得更快的執(zhí)行速度,通常把 stage2 加載到 RAM 空間中來執(zhí)行,因此必需為加載 Boot Loader 的 stage2 預(yù)備好一段可用的 RAM 空間范圍。 由于 stage2 通常是 C 言語執(zhí)行代碼,因此在思索空間大小時,除了 stage2 可執(zhí)行映象的大小外,還必需把堆??臻g也思索進(jìn)來。此外,空間大小最好是 memory page 大小(通常是 4KB)的倍數(shù)。普通而言,1M 的 RAM 空間曾經(jīng)足夠了。將 stage2 安排到整個 RAM 空間的最頂 1MB(也即(Ram
16、End-1MB) - RamEnd)是一種值得引薦的方法。 RAM 空間范圍的大小記為:stage2_size(字節(jié)),把起始地址和終止地址分別記為:stage2_start 和 stage2_end(這兩個地址均以 4 字節(jié)邊境對齊)。因此: stage2_endstage2_startstage2_size 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架另外,還必需確保所安排的地址范圍的確實確是可讀寫的 RAM 空間,因此,必需對他所安排的地址范圍進(jìn)展測試。(檢測算法為:test_mempage,向內(nèi)存中寫入恣意的數(shù)字。比如:向第一個字寫入 0 x55,第 2 個字寫入 0 xaa。再
17、讀出來,比較是不是寫入的數(shù)據(jù).) 3 拷貝 stage2 到 RAM 中 拷貝時要確定兩點:(1) stage2 的可執(zhí)行映象在固態(tài)存儲設(shè)備的存放起始地址和終止地址;(2) RAM 空間的起始地址。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架4 設(shè)置堆棧指針 sp 堆棧指針設(shè)置是為了執(zhí)行 C 言語代碼作好預(yù)備。通常我們可以把 sp 的值設(shè)置為(stage2_end-4).系統(tǒng)的物理內(nèi)存規(guī)劃應(yīng)該如右圖2所示。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架5 跳轉(zhuǎn)到 stage2 的 C 入口點 在上述一切都就緒后,就可以跳轉(zhuǎn)到 Boot Loader 的 stage2 去執(zhí)行了。比
18、如,在 ARM 系統(tǒng)中,這可以經(jīng)過修正 PC 存放器為適宜的地址來實現(xiàn)。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架5.3.2 Boot Loader 的 stage2stage2 的代碼通常用 C 言語來實現(xiàn)。但是與普通 C 言語運用程序不同的是,在編譯和鏈接 boot loader 這樣的程序時,我們不能運用 glibc 庫中的任何支持函數(shù)。這就給我們帶來一個問題,那就是從那里跳轉(zhuǎn)進(jìn) main() 函數(shù)呢?main() 函數(shù)的起始地址作為整個 stage2 執(zhí)行映像的入口點。這樣做有兩個缺陷:1)無法經(jīng)過main() 函數(shù)傳送函數(shù)參數(shù);2)無法處置 main() 函數(shù)前往的情況。一
19、種更為巧妙的方法是利用 trampoline(彈簧床)的概念。也即,用匯編言語寫一段trampoline 小程序,并將這段 trampoline 小程序來作為 stage2 可執(zhí)行映象的執(zhí)行入口點。然后可以在 trampoline 匯編小程序中用 CPU 跳轉(zhuǎn)指令跳入 main() 函數(shù)中去執(zhí)行;而當(dāng) main() 函數(shù)前往時,CPU 執(zhí)行途徑顯然再次回到trampoline 程序。簡而言之,這種方法的思想就是:用這段 trampoline 小程序來作為 main() 函數(shù)的外部包裹(external wrapper)。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架下面給出一個簡單的 t
20、rampoline 程序例如(來自blob): 可以看出,當(dāng) main() 函數(shù)前往后,我們又用一條跳轉(zhuǎn)指令重新執(zhí)行 trampoline 程序當(dāng)然也就重新執(zhí)行 main() 函數(shù),這也就是 trampoline(彈簧床)一詞的意思所在。 .text.globl _trampoline_trampoline:blmain/* if main ever returns we just call it again */b_trampoline 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架1.初始化本階段要運用到的硬件設(shè)備 初始化至少一個串口,以便和終端用戶進(jìn)展 I/O 輸出信息;初始化計時器
21、等。 在初始化這些設(shè)備之前,也可以重新把 LED 燈點亮,以闡明我們曾經(jīng)進(jìn)入 main() 函數(shù)執(zhí)行。 設(shè)備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號等。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架2 .檢測系統(tǒng)的內(nèi)存映射memory map 所謂內(nèi)存映射就是指在整個 4GB 物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的 RAM 單元。(比如,在 Samsung S3C44B0X CPU 中,從 0 x0c00,0000 到 0 x1000,0000 之間的 64M 地址空間被用作系統(tǒng)的 RAM 地址空間。)詳細(xì)的嵌入式系統(tǒng)往往只把 CPU 預(yù)留的全部 RAM 地址
22、空間中的一部分映射到 RAM 單元上,而讓剩下的那部分預(yù)留 RAM 地址空間處于未運用形狀。 由于上述這個現(xiàn)實,因此 Boot Loader 的 stage2 必需在它想干點什么 (比如,將存儲在 flash 上的內(nèi)核映像讀到 RAM 空間中) 之前檢測整個系統(tǒng)的內(nèi)存映射情況,也即它必需知道 CPU 預(yù)留的全部 RAM 地址空間中的哪些被真正映射到 RAM 地址單元,哪些是處于 unused 形狀的。 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架3 .加載內(nèi)核映像和根文件系統(tǒng)映像 (1) 規(guī)劃內(nèi)存占用的規(guī)劃 這里包括兩個方面:(1)內(nèi)核映像所占用的內(nèi)存范圍;2根文件系統(tǒng)所占用的內(nèi)存范圍。
23、在規(guī)劃內(nèi)存占用的規(guī)劃時,主要思索基地址和映像的大小兩個方面。 內(nèi)核映像,普通將其拷貝到從(MEM_START0 x8000) 這個基地址開場的大約1MB大小的內(nèi)存范圍內(nèi)(嵌入式 Linux 的內(nèi)核普通都不操過 1MB)。為什么要把從 MEM_START 到 MEM_START0 x8000 這段 32KB 大小的內(nèi)存空出來呢?這是由于 Linux 內(nèi)核要在這段內(nèi)存中放置一些全局?jǐn)?shù)據(jù)構(gòu)造,如:啟動參數(shù)和內(nèi)核頁表等信息。根文件系統(tǒng)映像,那么普通將其拷貝到MEM_START+0 x0010,0000 開場的地方。假設(shè)用 Ramdisk 作為根文件系統(tǒng)映像,那么其解壓后的大小普通是1MB。 5.3Bo
24、otLoader的主要義務(wù)與典型構(gòu)造框架2從 Flash 上拷貝 由于像 ARM 這樣的嵌入式 CPU 通常都是在一致的內(nèi)存地址空間中尋址 Flash 等固態(tài)存儲設(shè)備的,因此從 Flash 上讀取數(shù)據(jù)與從 RAM 單元中讀取數(shù)據(jù)并沒有什么不同。用一個簡單的循環(huán)就可以完成從 Flash 設(shè)備上拷貝映像的任務(wù): while(count) *dest+ = *src+; count -= 4; 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架4 .設(shè)置內(nèi)核的啟動參數(shù) 應(yīng)該說,在將內(nèi)核映像和根文件系統(tǒng)映像拷貝到 RAM 空間中后,就可以預(yù)備啟動 Linux 內(nèi)核了。但是在調(diào)用內(nèi)核之前,應(yīng)該作一步預(yù)備
25、任務(wù),即:設(shè)置 Linux 內(nèi)核的啟動參數(shù)。 Linux 2.4.x 以后的內(nèi)核都期望以標(biāo)志列表(tagged list)的方式來傳送啟動參數(shù)。啟動參數(shù)標(biāo)志列表以標(biāo)志 ATAG_CORE 開場,以標(biāo)志 ATAG_NONE 終了。每個標(biāo)志由標(biāo)識被傳送參數(shù)的 tag_header 構(gòu)造以及隨后的參數(shù)值數(shù)據(jù)構(gòu)造來組成。數(shù)據(jù)構(gòu)造 tag 和 tag_header 定義在 Linux 內(nèi)核源碼的include/asm/setup.h 頭文件中. 5.3BootLoader的主要義務(wù)與典型構(gòu)造框架5 .調(diào)用內(nèi)核 Boot Loader 調(diào)用 Linux 內(nèi)核的方法是直接跳轉(zhuǎn)到內(nèi)核的第一條指令處,也即直接跳
26、轉(zhuǎn)到 MEM_START0 x8000 地址處。在跳轉(zhuǎn)時,以下條件要滿足: 1 CPU 存放器的設(shè)置: 2 CPU 方式: 必需制止中斷IRQs和FIQs; CPU 必需 SVC 方式; 3 Cache 和 MMU 的設(shè)置:MMU 必需封鎖; 指令 Cache 可以翻開也可以封鎖; 數(shù)據(jù) Cache 必需封鎖; R00; R1機(jī)器類型 ID;關(guān)于 Machine Type Number, 可以參見 linux/arch/arm/tools/mach-types。 R2啟動參數(shù)標(biāo)志列表在 RAM 中起始基地址;5.4串口終端 在 boot loader 程序的設(shè)計與實現(xiàn)中,沒有什么可以比從串口終
27、端正確地收到打印信息能更令人激動了。此外,向串口終端打印信息也是一個非常重要而又有效的調(diào)試手段。但是,我們經(jīng)常會碰到串口終端顯示亂碼或根本沒有顯示的問題。呵斥這個問題主要有兩種緣由:(1) boot loader 對串口的初始化設(shè)置不正確。(2) 運轉(zhuǎn)在 host 端的終端仿真程序?qū)Υ诘脑O(shè)置不正確,這包括:波特率、奇偶校驗、數(shù)據(jù)位和停頓位等方面的設(shè)置。 5.4串口終端 此外,有時也會碰到這樣的問題,那就是:在 boot loader 的運轉(zhuǎn)過程中我們可以正確地向串口終端輸出信息,但當(dāng) boot loader 啟動內(nèi)核后卻無法看到內(nèi)核的啟動輸出信息。對這一問題的緣由可以從以下幾個方面來思索:
28、(1) 首先請確認(rèn)他的內(nèi)核在編譯時配置了對串口終端的支持,并配置了正確的串口驅(qū)動程序。 (2) 他的 boot loader 對串口的初始化設(shè)置能夠會和內(nèi)核對串口的初始化設(shè)置不一致。此外,對于諸如 s3c44b0 x 這樣的 CPU,CPU 時鐘頻率的設(shè)置也會影響串口,因此假設(shè) boot loader 和內(nèi)核對其 CPU 時鐘頻率的設(shè)置不一致,也會使串口終端無法正確顯示信息。 (3) 最后,還要確認(rèn) boot loader 所用的內(nèi)核基地址必需和內(nèi)核映像在編譯時所用的運轉(zhuǎn)基地址一致,尤其是對于 uClinux 而言。假設(shè)他的內(nèi)核映像在編譯時用的基地址是 0 xc0008000,但他的 boot
29、 loader 卻將它加載到 0 xc0010000 處去執(zhí)行,那么內(nèi)核映像當(dāng)然不能正確地執(zhí)行了。 2410初始化分析可執(zhí)行文件組成及內(nèi)存映射 可執(zhí)行文件的組成在ADS下,可執(zhí)行文件有兩種,一種是.axf文件,帶有調(diào)試信息,可供AXD調(diào)試工具運用.另一種是.bin文件,可執(zhí)行的二進(jìn)制代碼文件。我們重點是講描.bin文件的組成。我們把可執(zhí)行文件分為兩種情況:分別為存放態(tài)和運轉(zhuǎn)態(tài)。1. 存放態(tài)存放態(tài)是指可執(zhí)行文件經(jīng)過fromelf產(chǎn)生后,在存儲介質(zhì)(flash或磁盤)上的分布. 此時可執(zhí)行文件一般由兩部分組成:分別是代碼段和數(shù)據(jù)段。代碼段又分為可執(zhí)行代碼段(.text)和只讀數(shù)據(jù)段(.rodata
30、),數(shù)據(jù)段又分為初始化數(shù)據(jù)段(.data)和未初始化數(shù)據(jù)段(.bss)。可執(zhí)行文件的存放態(tài)如下:+| .bss |+- 數(shù)據(jù)段| .data |+| .rodata |_| 代碼段| .text |+運轉(zhuǎn)態(tài)可執(zhí)行文件經(jīng)過裝載過程, 搬入到RAM中運轉(zhuǎn), 這時候可執(zhí)行文件就變成運轉(zhuǎn)態(tài)。在ADS下對可執(zhí)行代碼各段有另一個稱號:| . |+| .bss | ZI 段+- 數(shù)據(jù)段| .data | RW 段+| .rodata |_| 代碼段(RO 段)| .text |+| . |裝載前當(dāng)可執(zhí)行文件裝載后, 在RAM中的分布如下:| . |+- ZI段終了地址| ZI 段 |+- ZI段起始地址|
31、保管區(qū)2 |+- RW段終了地址| RW 段 |+- RW段起始地址| 保管區(qū)1 |+- RO段終了地址| RO 段 |+- RO段起始地址| . |裝載后所以裝載過程必需完成把執(zhí)行文件的各個段從存儲介質(zhì)上搬到RAM指定的位置。而這個裝載過程由誰來完成呢?由我們的啟動程序來完成.裝載過程在ADS中,可以經(jīng)過兩種方式來指定可執(zhí)行代碼各段在RAM中的位置,一個是用armlink來指定,一種是用scatter文件來指定.RAM區(qū)的起始地址:0 x30000000.1. armlink指定代碼段地址我們通常的代碼,只用指定兩個段開場地址, RO段的起始地址和RW段的起始地址, ZI段緊接在RW段之后.例如見該部分的. scatter指定代碼段地址我們也可以經(jīng)過scatter文件指定可執(zhí)行文件各段的詳細(xì)地址. Scatter文件如下:MYLOADER 0 x30000000;MYLOADER: 為可執(zhí)行文件的稱號, 可自定義;0 x3000000: 起始地址RO 0 x30000000;RO 只讀代碼段的稱號;0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學(xué)教學(xué)質(zhì)量保證措施制度
- 交通宣傳教育普及制度
- 2026年通信行業(yè)服務(wù)標(biāo)準(zhǔn)試題通信類信訪的快速響應(yīng)機(jī)制
- 2026年工業(yè)機(jī)器人制造與質(zhì)量管控考試卷
- 2026年律師實務(wù)法律案例分析題庫
- 2025年放棄遺產(chǎn)繼承聲明書(公證用)
- 綠色甲醇作為船用燃料的加注樞紐建設(shè)投資框架協(xié)議
- 檢驗科實驗室電源短路的應(yīng)急處置制度及流程
- 古埃及藝術(shù)教學(xué)課件
- 2025年廣東碧桂園職業(yè)學(xué)院馬克思主義基本原理概論期末考試模擬題帶答案解析
- 2025大模型安全白皮書
- 2026國家國防科技工業(yè)局所屬事業(yè)單位第一批招聘62人備考題庫及1套參考答案詳解
- 工程款糾紛專用!建設(shè)工程施工合同糾紛要素式起訴狀模板
- 2026湖北武漢長江新區(qū)全域土地管理有限公司招聘3人筆試備考題庫及答案解析
- 110(66)kV~220kV智能變電站設(shè)計規(guī)范
- (正式版)DB44∕T 2784-2025 《居家老年人整合照護(hù)管理規(guī)范》
- 2025年美國心臟病協(xié)會心肺復(fù)蘇和心血管急救指南(中文完整版)
- 1、湖南大學(xué)本科生畢業(yè)論文撰寫規(guī)范(大文類)
- 基于多源數(shù)據(jù)融合的深圳市手足口病時空傳播模擬與風(fēng)險預(yù)測模型構(gòu)建及應(yīng)用
- 咯血的急救及護(hù)理
- 2025初三歷史中考一輪復(fù)習(xí)資料大全
評論
0/150
提交評論