ARM的位置在Bootloader中的應(yīng)用ppt課件_第1頁(yè)
ARM的位置在Bootloader中的應(yīng)用ppt課件_第2頁(yè)
ARM的位置在Bootloader中的應(yīng)用ppt課件_第3頁(yè)
ARM的位置在Bootloader中的應(yīng)用ppt課件_第4頁(yè)
ARM的位置在Bootloader中的應(yīng)用ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、ARM的位置在Bootloader中的運(yùn)用引言1 位置無(wú)關(guān)代碼及程序設(shè)計(jì)方法1.1 根本概念與實(shí)現(xiàn)原理1.2 arm處置器的位置無(wú)關(guān)程序設(shè)計(jì)要點(diǎn)1 程序設(shè)計(jì)規(guī)范2 程序設(shè)計(jì)規(guī)范22 位置無(wú)關(guān)代碼在Bootloader設(shè)計(jì)中的運(yùn)用運(yùn)用位置無(wú)關(guān)設(shè)計(jì)Bootloader程序有如下優(yōu)點(diǎn):3 結(jié)論.arm處置器支持位置無(wú)關(guān)的程序設(shè)計(jì),這種程序加載到存儲(chǔ)器的恣意地址空間都可以正常運(yùn)轉(zhuǎn),其設(shè)計(jì)方法在嵌入式運(yùn)用系統(tǒng)開(kāi)發(fā)中具有重要的作用。本文首先引見(jiàn)位置無(wú)關(guān)代碼的根本概念和實(shí)現(xiàn)原理,然后論述基于arm匯編位置無(wú)關(guān)的程序設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程,最后以嵌入式Bootloader程序設(shè)計(jì)為例,引見(jiàn)位置無(wú)關(guān)程序設(shè)計(jì)在Boo

2、tloader程序設(shè)計(jì)中的作用。.基于位置無(wú)關(guān)代碼PICPositionIndependent Code的程序設(shè)計(jì)在嵌入式運(yùn)用系統(tǒng)開(kāi)發(fā)中具有重要的作用,尤其在裸機(jī)形狀下開(kāi)發(fā)Bootloader程序及進(jìn)展內(nèi)核初始化設(shè)計(jì);利用位置無(wú)關(guān)的程序設(shè)計(jì)方法還可以在詳細(xì)運(yùn)用中用于構(gòu)建高效率動(dòng)態(tài)鏈接庫(kù),因此深化了解和熟練掌握位置無(wú)關(guān)的程序設(shè)計(jì)方法,有助于開(kāi)發(fā)人員設(shè)計(jì)出構(gòu)造簡(jiǎn)單、明晰的運(yùn)用程序。本文首先引見(jiàn)位置無(wú)關(guān)代碼的根本概念和實(shí)現(xiàn)原理,然后論述基于arm匯編位置無(wú)關(guān)的程序設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程,最后以Bootloader程序設(shè)計(jì)為例,引見(jiàn)了位置無(wú)關(guān)程序設(shè)計(jì)在Bootloader程序設(shè)計(jì)中的作用。引言.1.1 根

3、本概念與實(shí)現(xiàn)原理運(yùn)用程序必需經(jīng)過(guò)編譯、匯編和鏈接后才變成可執(zhí)行文件,在鏈接時(shí),要對(duì)一切目的文件進(jìn)展重定位(relocation),建立符號(hào)援用規(guī)那么,同時(shí)為變量、函數(shù)等分配運(yùn)轉(zhuǎn)地址。當(dāng)程序執(zhí)行時(shí),系統(tǒng)必需把代碼加載到鏈接時(shí)所指定的地址空間,以保證程序在執(zhí)行過(guò)程中對(duì)變量、函數(shù)等符號(hào)的正確援用,使程序正常運(yùn)轉(zhuǎn)。在具有操作系統(tǒng)的系統(tǒng)中,重定位過(guò)程由操作系統(tǒng)自動(dòng)完成。在設(shè)計(jì)Bootloader程序時(shí),必需在裸機(jī)環(huán)境中進(jìn)展,這時(shí)Bootloader映像文件的運(yùn)轉(zhuǎn)地址必需由程序員設(shè)定。通常情況下,將 Bootloader程序下載到ROM的0 x0地址進(jìn)展啟動(dòng),而在大多數(shù)運(yùn)用系統(tǒng)中,為了快速啟動(dòng),首先將Bo

4、otloader程序拷貝到SDRAM中再運(yùn)轉(zhuǎn)。普通情況下,這兩者的地址并不一樣,程序在SDRAM中的地址重定位過(guò)程必需由程序員完成。實(shí)踐上,由于Bootloader是系統(tǒng)上電后要執(zhí)行的第一段程序,Bootloader程序的拷貝和在這之前的一切任務(wù)都必需由其本身來(lái)完成,而這些指令都是在ROM中執(zhí)行的。也就是說(shuō),這些代碼即使不在鏈接時(shí)所指定的運(yùn)轉(zhuǎn)時(shí)地址空間,也可以正確執(zhí)行。這就是位置無(wú)關(guān)代碼,它是一段加載到恣意地址空間都能正常執(zhí)行的特殊代碼。1 位置無(wú)關(guān)代碼及程序設(shè)計(jì)方法. 程序在運(yùn)轉(zhuǎn)期間動(dòng)態(tài)加載到內(nèi)存; 程序在不同場(chǎng)所與不同程序組合后加載到內(nèi)存(如共享的動(dòng)態(tài)鏈接庫(kù)); 在運(yùn)轉(zhuǎn)期間不同地址相互之間

5、的映射如Bootloader程序。雖然在用GCC編譯時(shí),運(yùn)用-fPIC選項(xiàng)可為C言語(yǔ)產(chǎn)生位置無(wú)關(guān)代碼,但這并不能修正程序設(shè)計(jì)中固有的位置相關(guān)性缺陷。特別是匯編言語(yǔ)代碼,必需由程序員遵照一定的程序設(shè)計(jì)準(zhǔn)那么,才干保證程序的位置無(wú)關(guān)性。位置無(wú)關(guān)代碼常用于以下場(chǎng)所:.arm程序的位置無(wú)關(guān)可執(zhí)行文件PIEPositionIndependent Executable包括位置無(wú)關(guān)代碼PIC和位置無(wú)關(guān)數(shù)據(jù)PIDPositionIndependent Data兩部分。PID主要針對(duì)可讀寫(xiě)數(shù)據(jù)段.data段,其中保管已賦初值的全局變量。為實(shí)現(xiàn)其位置無(wú)關(guān)性,通常運(yùn)用存放器R9作為靜態(tài)基址存放器,使其指向該可讀寫(xiě)段

6、的首地址,并運(yùn)用相對(duì)于基址存放器的偏移量來(lái)對(duì)該段的變量進(jìn)展尋址。這種方法常用于為可重入程序的多個(gè)實(shí)例產(chǎn)生多個(gè)獨(dú)立的數(shù)據(jù)段。在程序設(shè)計(jì)中,普通不用思索可讀寫(xiě)段的位置無(wú)關(guān)性,這主要是由于可讀寫(xiě)數(shù)據(jù)主要分配在SDRAM中。1.2 arm處置器的位置無(wú)關(guān)程序設(shè)計(jì)要點(diǎn).PIC包括程序中的代碼和只讀數(shù)據(jù).text段,為保證程序能在ROM和SDRAM空間都能正確運(yùn)轉(zhuǎn)如裸機(jī)形狀下的Bootloader程序,必需采用位置無(wú)關(guān)代碼程序設(shè)計(jì)。下面重點(diǎn)引見(jiàn)PIC的程序設(shè)計(jì)要點(diǎn)。PIC遵照只讀段位置無(wú)關(guān)ROPIReadOnly Position Independence的ATPCSarmThumb Procedure

7、Call Standard的程序設(shè)計(jì)規(guī)范:.援用同一ROPI段或相對(duì)位置固定的另一ROPI段中的符號(hào)時(shí),必需是基于PC的符號(hào)援用,即使用相對(duì)于當(dāng)前PC的偏移量來(lái)實(shí)現(xiàn)跳轉(zhuǎn)或進(jìn)展常量訪(fǎng)問(wèn)。 位置無(wú)關(guān)的程序跳轉(zhuǎn)。在arm匯編程序中,運(yùn)用相對(duì)跳轉(zhuǎn)指令B/BL實(shí)現(xiàn)程序跳轉(zhuǎn)。指令中所跳轉(zhuǎn)的目的地址用基于當(dāng)前PC的偏移量來(lái)表示,與鏈接時(shí)分配給地址標(biāo)號(hào)的絕對(duì)地址值無(wú)關(guān),因此代碼可以在任何位置進(jìn)展跳轉(zhuǎn),實(shí)現(xiàn)位置無(wú)關(guān)性。另外,還可運(yùn)用ADR或ADRL偽指令將地址標(biāo)號(hào)值讀取到PC中實(shí)現(xiàn)程序跳轉(zhuǎn)。這是由于ADR或ADRL等偽指令會(huì)被編譯器交換為對(duì)基于PC的地址值進(jìn)展操作,但這種方式所能讀取的地址范圍較小,并且會(huì)因地址

8、值能否為字對(duì)齊而異。但在arm程序中,運(yùn)用LDR等指令直接將地址標(biāo)號(hào)值讀取到 PC中實(shí)現(xiàn)程序跳轉(zhuǎn)不是位置無(wú)關(guān)的。1 程序設(shè)計(jì)規(guī)范.例如:LDRPC, =main上面的LDR匯編偽指令編譯后的結(jié)果為:LDRPC, PC, OFFSET_TO_LPOOLLPOOLDCD main可見(jiàn),雖然LDR是把基于PC的一個(gè)存儲(chǔ)單元LPOOL的內(nèi)容加載到PC中,但該存儲(chǔ)單元中保管的卻是鏈接時(shí)所決議的main函數(shù)入口的絕對(duì)地址,所以main函數(shù)實(shí)踐所在的段不是位置無(wú)關(guān)。 位置無(wú)關(guān)的常量訪(fǎng)問(wèn)。在運(yùn)用程序中,經(jīng)常要讀寫(xiě)相關(guān)存放器以完成必要的硬件初始化。為加強(qiáng)程序的可讀性,利用EQU偽指令對(duì)一些常量進(jìn)展賦值,但在訪(fǎng)問(wèn)

9、過(guò)程中,必需實(shí)現(xiàn)位置無(wú)關(guān)性。下面以PXA270的GPIO初始化引見(jiàn)位置無(wú)關(guān)的常量訪(fǎng)問(wèn)方法。.GPIO_BASEEQU0 x40e00000;GPIO基址存放器地址GPDR0EQU0 x00c;相對(duì)于GPIO基址存放器的偏移量init_GPDR0EQU0 xfffbfe00;存放器GPDR0初值LDRR1, =GPIO_BASELDRR0, =init_GPDR0STRR0, R1, #GPDR0上述匯編代碼段經(jīng)編譯后的結(jié)果為:LDRR1, PC, OFFSET_TO_GPIO_BASELDRR0, PC, OFFSET_TO_init_GPDR0STRR0, R1, #0 xcGPIO_BAS

10、EDCD0 x40e00000GPDR0DCD0 x00cinit_GPDR0DCD0 xfffbfe00.可見(jiàn),LDR偽指令實(shí)踐上運(yùn)用基于PC的偏移量來(lái)對(duì)符號(hào)常量GPIO_BASE和init_GPDR0進(jìn)展援用,因此是位置無(wú)關(guān)的。由此可以得出如下結(jié)論:運(yùn)用LDR偽指令將一個(gè)常量讀取到非PC的其他通用存放器中可實(shí)現(xiàn)位置無(wú)關(guān)的常量訪(fǎng)問(wèn);但將一個(gè)地址值讀取到PC中進(jìn)展程序跳轉(zhuǎn)時(shí),跳轉(zhuǎn)目的那么是位置相關(guān)的。.其他被ROPI段中的代碼援用的必需是絕對(duì)地址,或者是基于可讀寫(xiě)位置無(wú)關(guān)(RWPI)段的靜態(tài)基址存放器的可寫(xiě)數(shù)據(jù)。運(yùn)用絕對(duì)地址只能援用被重定位到特定位置的代碼段中的符號(hào),經(jīng)過(guò)在位置無(wú)關(guān)代碼中引入絕

11、對(duì)地址,可以讓程序跳轉(zhuǎn)到指定位置。例如,假設(shè) Bootloader的階段1將其本身代碼拷貝到鏈接時(shí)所指定的SDRAM地址空間后,當(dāng)要跳轉(zhuǎn)到階段2的C程序入口時(shí),可以運(yùn)用指令“LDRPC, =main跳轉(zhuǎn)到程序在SDRAM中的main函數(shù)入口地址開(kāi)場(chǎng)執(zhí)行。這是由于程序在編譯鏈接時(shí)給main函數(shù)分派絕對(duì)地址,系統(tǒng)經(jīng)過(guò)將main函數(shù)的絕對(duì)地址直接賦給PC實(shí)現(xiàn)程序跳轉(zhuǎn)。假設(shè)運(yùn)用相對(duì)跳轉(zhuǎn)指令“Bmain,那么只會(huì)跳轉(zhuǎn)到啟動(dòng)ROM內(nèi)部的main函數(shù)入口。2 程序設(shè)計(jì)規(guī)范2.在運(yùn)用GNU工具開(kāi)發(fā)Bootloader時(shí),程序在鏈接時(shí)會(huì)經(jīng)過(guò)一個(gè)鏈接腳本linker script來(lái)設(shè)定映像文件的內(nèi)存映射。一個(gè)簡(jiǎn)單

12、的鏈接腳本構(gòu)造如下:OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS . = BOOTADDR;/*Bootloader的起始地址*/_boot_start = .;.textALIGN(4): /*代碼段.text*/*(.text)2 位置無(wú)關(guān)代碼在Bootloader設(shè)計(jì)中的運(yùn)用.dataALIGN(4): /*數(shù)據(jù)段.data*/*(.data).gotALIGN(4): /*全局偏移量表.got段*/*(.got)_boot_end = .;/*Bootloader映像文件的終了地址*/.bssALIGN(16): /*堆棧段.bss*/_bss_start

13、 = .;*(.bss)_bss_end =.;.這里不再引見(jiàn)鏈接腳本的語(yǔ)法。需求指出的是,鏈接腳本中所描畫(huà)的輸出段地址為虛擬地址VMAVirtual Memory Address。這里的“虛擬地址僅指映像文件執(zhí)行時(shí),各輸出段所重定位到相應(yīng)的存儲(chǔ)地址空間,與內(nèi)存管理無(wú)關(guān)。因此,上面的鏈接腳本實(shí)踐上指定了 Bootloader映像在執(zhí)行時(shí),將被重定位到BOOTADDR開(kāi)場(chǎng)的存儲(chǔ)地址空間,以保證在相關(guān)位置對(duì)符號(hào)進(jìn)展正確援用,使程序正常運(yùn)轉(zhuǎn)。arm處置器復(fù)位后總是從0 x0地址取第1條指令,因此只需把BOOTADDR設(shè)置為0,再把編譯后生成的可執(zhí)行二進(jìn)制文件下載到ROM的 0 x0地址開(kāi)場(chǎng)的存儲(chǔ)空間

14、,程序便可正常引導(dǎo);但是,一旦在鏈接時(shí)指定映像文件從0 x0地址開(kāi)場(chǎng),那么Bootloader就只能在0 x0地址開(kāi)場(chǎng)的 ROM空間內(nèi)運(yùn)轉(zhuǎn),而無(wú)法拷貝到SDRAM空間運(yùn)轉(zhuǎn)實(shí)現(xiàn)快速引導(dǎo)。當(dāng)然,對(duì)PXA270等具有MMU功能的微處置器來(lái)說(shuō),雖然可以先將 Bootloader映像整個(gè)拷貝到SDRAM中,再運(yùn)用MMU功能將SDRAM空間映射到0 x0地址,進(jìn)而繼續(xù)在SDRAM中運(yùn)轉(zhuǎn);但這樣一方面會(huì)使得 Bootloader的設(shè)計(jì)與實(shí)現(xiàn)復(fù)雜化,另一方面在一些必需屏蔽MMU功能的運(yùn)用中例如引導(dǎo)armlinux系統(tǒng),無(wú)法運(yùn)用MMU進(jìn)展地址重映射。.利用ARM的基于位置無(wú)關(guān)的程序設(shè)計(jì)可以處理上述問(wèn)題。只需在程

15、序鏈接時(shí),將BOOTADDR設(shè)置為SDRAM空間的地址普通情況下利用 SDRAM中最高的1 MB存儲(chǔ)空間作為起始地址,這樣arm處置器上電復(fù)位后Bootloader依然可以從地址0開(kāi)場(chǎng)執(zhí)行,并將本身拷貝到指定的_boot_start 起始的SDRAM中運(yùn)轉(zhuǎn)。實(shí)現(xiàn)上述功能的鏈接腳本所對(duì)應(yīng)的啟動(dòng)代碼架構(gòu)如下:.section .text.globl _start_start:Breset/*復(fù)位異常*/*其他異常處置代碼*/.reset:/*復(fù)位處置程序*/copy_boot:/*拷貝Bootloader到SDRAM*/LDRR0, =0 x0LDRR1, =_boot_startLDRR2, =

16、_boot_end1:LDRMIA R0!, R3-R10 STRMIA R1!, R3-R10 CMPR1, R2BLT1bclear_bss:/*清零.bss段*/.BLinit_Stack/*初始化堆棧*/LDRPC, = main/*跳轉(zhuǎn)到階段2的C程序入口*/.end程序入口為_(kāi)start,即復(fù)位異常,一切其他異常向量都運(yùn)用相對(duì)跳轉(zhuǎn)指令B來(lái)實(shí)現(xiàn),以保證位置無(wú)關(guān)特性。在完成根本的硬件初始化后,利用鏈接腳本傳送過(guò)來(lái)_boot_start和_boot_end的參數(shù),將Bootloader映像整個(gè)拷貝到指定的SDRAM空間,并清零.bss段,初始化堆棧后,程序?qū)ain函數(shù)入口的絕對(duì)地址賦給

17、PC,進(jìn)而跳轉(zhuǎn)到SDRAM中繼續(xù)運(yùn)轉(zhuǎn)。程序在跳轉(zhuǎn)到main函數(shù)之前,一切的代碼都在ROM中運(yùn)轉(zhuǎn),因此必需求保證代碼的位置無(wú)關(guān)性,所以在調(diào)用初始化GPIO、存儲(chǔ)系統(tǒng)和堆棧等子程序時(shí),都運(yùn)用相對(duì)跳轉(zhuǎn)指令來(lái)完成。. 簡(jiǎn)化設(shè)計(jì),方便實(shí)現(xiàn)系統(tǒng)的快速引導(dǎo)。位置無(wú)關(guān)代碼可以防止在引導(dǎo)時(shí)進(jìn)展地址映射,并方便地跳轉(zhuǎn)到SDRAM中實(shí)現(xiàn)快速引導(dǎo)。 實(shí)現(xiàn)復(fù)位處置智能化。由于位置無(wú)關(guān)代碼可以被加載到恣意地址空間運(yùn)轉(zhuǎn),因此其運(yùn)轉(zhuǎn)時(shí)的當(dāng)前地址與鏈接時(shí)所指派的地址并不一定一樣。利用這一特性,可以在復(fù)位處置程序中使處置器進(jìn)入SVC方式并封鎖中斷后參與如下代碼,便可根據(jù)當(dāng)前運(yùn)轉(zhuǎn)時(shí)的地址進(jìn)展不同的復(fù)位處置:ADRR0, _star

18、t/*讀取當(dāng)前PC附近的_start標(biāo)號(hào)所在指令地址*/LDRR1,=_boot_start/*讀取Bootloader在SDRAM的起始地址*/CMPR0,R1BEQclear_bss運(yùn)用位置無(wú)關(guān)設(shè)計(jì)Bootloader程序有如下優(yōu)點(diǎn).上述代碼中的ADR指令讀取的_start標(biāo)號(hào)地址由指令的執(zhí)行地址決議。假設(shè)是從SDRAM中的Bootloader啟動(dòng),那么上述比較結(jié)果相等,程序直接跳轉(zhuǎn)到clear_bss標(biāo)號(hào)地址處執(zhí)行,這樣可以防止存儲(chǔ)系統(tǒng)的重新初始化和Bootloader的拷貝過(guò)程;假設(shè)是上電或硬件復(fù)位,程序從 ROM啟動(dòng),那么上述比較結(jié)果不等,程序便進(jìn)展包括系統(tǒng)初始化和Bootloader拷貝等過(guò)程的全面復(fù)位處置操作。 便于調(diào)試。Bootloader的調(diào)試通常也是一個(gè)繁瑣的過(guò)程,運(yùn)用位置無(wú)關(guān)代碼,那么可

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論