<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > ARM處理器的位置無(wú)關(guān)程序設計

ARM處理器的位置無(wú)關(guān)程序設計

作者: 時(shí)間:2011-09-26 來(lái)源:網(wǎng)絡(luò ) 收藏

支持,這種程序加載到存儲器的任意地址空間都可以正常運行,其設計方法在嵌入式應用系統開(kāi)發(fā)中具有重要的作用。尤其在裸機狀態(tài)下開(kāi)發(fā)Bootloader程序及進(jìn)行內核初始化設計;利用方法還可以在具體應用中用于構建高效率動(dòng)態(tài)鏈接庫,因而了解方法,有助于開(kāi)發(fā)人員設計出結構簡(jiǎn)單、清晰的應用程序。

本文引用地址:http://dyxdggzs.com/article/150168.htm

  應用程序必須經(jīng)過(guò)編譯、匯編和鏈接后才變成可執行文件,在鏈接時(shí),要對所有目標文件進(jìn)行重定位(relocatiON),建立符號引用規則,同時(shí)為變量、函數等分配運行地址。當程序執行時(shí),系統必須把代碼加載到鏈接時(shí)所指定的地址空間,以保證程序在執行過(guò)程中對變量、函數等符號的正確引用,使程序正常運行。在具有操作系統的系統中,重定位過(guò)程由操作系統自動(dòng)完成。

  在設計Bootloader程序時(shí),必須在裸機環(huán)境中進(jìn)行,這時(shí)Bootloader映像文件的運行地址必須由程序員設定。通常情況下,將Bootloader程序下載到ROM的0x0地址進(jìn)行啟動(dòng),而在大多數應用系統中,為了快速啟動(dòng),首先將Bootloader程序拷貝到SDRAM中再運行。一般情況下,這兩者的地址并不相同,程序在SDRAM中的地址重定位過(guò)程必須由程序員完成。實(shí)際上,由于Bootloader是系統上電后要執行的第一段程序,Bootloader程序的拷貝和在這之前的所有工作都必須由其自身來(lái)完成,而這些指令都是在ROM中執行的。也就是說(shuō),這些代碼即使不在鏈接時(shí)所指定的運行時(shí)地址空間,也可以正確執行。這就是位置無(wú)關(guān)代碼,它是一段加載到任意地址空間都能正常執行的特殊代碼。

  位置無(wú)關(guān)代碼常用于以下場(chǎng)合:

  程序在運行期間動(dòng)態(tài)加載到內存;

  程序在不同場(chǎng)合與不同程序組合后加載到內存(如共享的動(dòng)態(tài)鏈接庫);

  在運行期間不同地址相互之間的映射(如Bootloader程序)。

  雖然在用GCC編譯時(shí),使用-fPIC選項可為C語(yǔ)言產(chǎn)生位置無(wú)關(guān)代碼,但這并不能修正程序設計中固有的位置相關(guān)性缺陷。特別是匯編語(yǔ)言代碼,必須由程序員遵循一定的程序設計準則,才能保證程序的位置無(wú)關(guān)性。

  程序的位置無(wú)關(guān)可執行文件PIE(PositionIndependent Executable)包括位置無(wú)關(guān)代碼PIC和位置無(wú)關(guān)數據PID(PositionIndependent Data)兩部分。

  PID主要針對可讀寫(xiě)數據段(.data段),其中保存已賦初值的全局變量。為實(shí)現其位置無(wú)關(guān)性,通常使用寄存器R9作為靜態(tài)基址寄存器,使其指向該可讀寫(xiě)段的首地址,并使用相對于基址寄存器的偏移量來(lái)對該段的變量進(jìn)行尋址。這種方法常用于為可重入程序的多個(gè)實(shí)例產(chǎn)生多個(gè)獨立的數據段。在程序設計中,一般不必考慮可讀寫(xiě)段的位置無(wú)關(guān)性,這主要是因為可讀寫(xiě)數據主要分配在SDRAM中。

  PIC包括程序中的代碼和只讀數據(.text段),為保證程序能在ROM和SDRAM空間都能正確運行(如裸機狀態(tài)下的Bootloader程序),必須采用位置無(wú)關(guān)代碼程序設計。

  PIC遵循只讀段位置無(wú)關(guān)ROPI(ReadOnly Position Independence)的ATPCS(Thumb Procedure Call STandard)的程序設計規范:

程序設計規范#e#

 ?。?) 程序設計規范1

  引用同一ROPI段或相對位置固定的另一ROPI段中的符號時(shí),必須是基于PC的符號引用,即使用相對于當前PC的偏移量來(lái)實(shí)現跳轉或進(jìn)行常量訪(fǎng)問(wèn)。

 ?、?位置無(wú)關(guān)的程序跳轉。在A(yíng)RM匯編程序中,使用相對跳轉指令B/BL實(shí)現程序跳轉。指令中所跳轉的目標地址用基于當前PC的偏移量來(lái)表示,與鏈接時(shí)分配給地址標號的絕對地址值無(wú)關(guān),因而代碼可以在任何位置進(jìn)行跳轉,實(shí)現位置無(wú)關(guān)性。

  另外,還可使用ADR或ADRL偽指令將地址標號值讀取到PC中實(shí)現程序跳轉。這是因為ADR或ADRL等偽指令會(huì )被編譯器替換為對基于PC的地址值進(jìn)行操作,但這種方式所能讀取的地址范圍較小,并且會(huì )因地址值是否為字對齊而異。

  但在A(yíng)RM程序中,使用LDR等指令直接將地址標號值讀取到PC中實(shí)現程序跳轉不是位置無(wú)關(guān)的。例如:  LDR PC, =main

  上面的偽指令編譯后的結果為:  LDR PC, [PC, OFFSET_TO_LPOOL]

  ?   LPOOL

  DCD main

  可見(jiàn),雖然LDR是把基于PC的一個(gè)存儲單元LPOOL的內容加載到PC中,但該存儲單元中保存的卻是鏈接時(shí)所決定的main函數入口的絕對地址,所以main函數實(shí)際所在的段不是位置無(wú)關(guān)。

 ?、?位置無(wú)關(guān)的常量訪(fǎng)問(wèn)。在應用程序中,經(jīng)常要讀寫(xiě)相關(guān)寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進(jìn)行賦值,但在訪(fǎng)問(wèn)過(guò)程中,必須實(shí)現位置無(wú)關(guān)性。下面以PXA270的GPIO初始化介紹位置無(wú)關(guān)的常量訪(fǎng)問(wèn)方法。

  GPIO_BASE EQU 0x40e00000; GPIO基址寄存器地址

  GPDR0 EQU 0x00c; 相對于GPIO基址寄存器的偏移量

  init_GPDR0 EQU 0xfffbfe00; 寄存器GPDR0初值

  LDR R1, =GPIO_BASE

  LDR R0, =init_GPDR0

  STR R0, [R1, #GPDR0]


上一頁(yè) 1 2 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>