




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
ARM的位置在Bootloader中的應用引言1位置無關代碼及程序設計方法1.1基本概念與實現原理1.2arm處理器的位置無關程序設計要點(1)程序設計規(guī)范(2)程序設計規(guī)范22位置無關代碼在Bootloader設計中的應用使用位置無關設計Bootloader程序有如下優(yōu)點:3結論
arm處理器支持位置無關的程序設計,這種程序加載到存儲器的任意地址空間都可以正常運行,其設計方法在嵌入式應用系統(tǒng)開發(fā)中具有重要的作用。本文首先介紹位置無關代碼的基本概念和實現原理,然后闡述基于arm匯編位置無關的程序設計方法和實現過程,最后以嵌入式Bootloader程序設計為例,介紹位置無關程序設計在Bootloader程序設計中的作用?;谖恢脽o關代碼PIC(PositionIndependentCode)的程序設計在嵌入式應用系統(tǒng)開發(fā)中具有重要的作用,尤其在裸機狀態(tài)下開發(fā)Bootloader程序及進行內核初始化設計;利用位置無關的程序設計方法還可以在具體應用中用于構建高效率動態(tài)鏈接庫,因而深入理解和熟練掌握位置無關的程序設計方法,有助于開發(fā)人員設計出結構簡單、清晰的應用程序。本文首先介紹位置無關代碼的基本概念和實現原理,然后闡述基于arm匯編位置無關的程序設計方法和實現過程,最后以Bootloader程序設計為例,介紹了位置無關程序設計在Bootloader程序設計中的作用。引言1.1基本概念與實現原理應用程序必須經過編譯、匯編和鏈接后才變成可執(zhí)行文件,在鏈接時,要對所有目標文件進行重定位(relocation),建立符號引用規(guī)則,同時為變量、函數等分配運行地址。當程序執(zhí)行時,系統(tǒng)必須把代碼加載到鏈接時所指定的地址空間,以保證程序在執(zhí)行過程中對變量、函數等符號的正確引用,使程序正常運行。在具有操作系統(tǒng)的系統(tǒng)中,重定位過程由操作系統(tǒng)自動完成。在設計Bootloader程序時,必須在裸機環(huán)境中進行,這時Bootloader映像文件的運行地址必須由程序員設定。通常情況下,將Bootloader程序下載到ROM的0x0地址進行啟動,而在大多數應用系統(tǒng)中,為了快速啟動,首先將Bootloader程序拷貝到SDRAM中再運行。一般情況下,這兩者的地址并不相同,程序在SDRAM中的地址重定位過程必須由程序員完成。實際上,由于Bootloader是系統(tǒng)上電后要執(zhí)行的第一段程序,Bootloader程序的拷貝和在這之前的所有工作都必須由其自身來完成,而這些指令都是在ROM中執(zhí)行的。也就是說,這些代碼即使不在鏈接時所指定的運行時地址空間,也可以正確執(zhí)行。這就是位置無關代碼,它是一段加載到任意地址空間都能正常執(zhí)行的特殊代碼。1位置無關代碼及程序設計方法◆程序在運行期間動態(tài)加載到內存;◆程序在不同場合與不同程序組合后加載到內存(如共享的動態(tài)鏈接庫);◆在運行期間不同地址相互之間的映射(如Bootloader程序)。雖然在用GCC編譯時,使用-fPIC選項可為C語言產生位置無關代碼,但這并不能修正程序設計中固有的位置相關性缺陷。特別是匯編語言代碼,必須由程序員遵循一定的程序設計準則,才能保證程序的位置無關性。位置無關代碼常用于以下場合:
arm程序的位置無關可執(zhí)行文件PIE(PositionIndependentExecutable)包括位置無關代碼PIC和位置無關數據PID(PositionIndependentData)兩部分。
PID主要針對可讀寫數據段(.data段),其中保存已賦初值的全局變量。為實現其位置無關性,通常使用寄存器R9作為靜態(tài)基址寄存器,使其指向該可讀寫段的首地址,并使用相對于基址寄存器的偏移量來對該段的變量進行尋址。這種方法常用于為可重入程序的多個實例產生多個獨立的數據段。在程序設計中,一般不必考慮可讀寫段的位置無關性,這主要是因為可讀寫數據主要分配在SDRAM中。1.2arm處理器的位置無關程序設計要點
PIC包括程序中的代碼和只讀數據(.text段),為保證程序能在ROM和SDRAM空間都能正確運行(如裸機狀態(tài)下的Bootloader程序),必須采用位置無關代碼程序設計。下面重點介紹PIC的程序設計要點。
PIC遵循只讀段位置無關ROPI(ReadOnlyPositionIndependence)的ATPCS(armThumbProcedureCallStandard)的程序設計規(guī)范:引用同一ROPI段或相對位置固定的另一ROPI段中的符號時,必須是基于PC的符號引用,即使用相對于當前PC的偏移量來實現跳轉或進行常量訪問。①位置無關的程序跳轉。在arm匯編程序中,使用相對跳轉指令B/BL實現程序跳轉。指令中所跳轉的目標地址用基于當前PC的偏移量來表示,與鏈接時分配給地址標號的絕對地址值無關,因而代碼可以在任何位置進行跳轉,實現位置無關性。另外,還可使用ADR或ADRL偽指令將地址標號值讀取到PC中實現程序跳轉。這是因為ADR或ADRL等偽指令會被編譯器替換為對基于PC的地址值進行操作,但這種方式所能讀取的地址范圍較小,并且會因地址值是否為字對齊而異。但在arm程序中,使用LDR等指令直接將地址標號值讀取到PC中實現程序跳轉不是位置無關的。(1)程序設計規(guī)范例如:
LDRPC,=main上面的LDR匯編偽指令編譯后的結果為:
LDRPC,[PC,OFFSET_TO_LPOOL]
LPOOLDCDmain可見,雖然LDR是把基于PC的一個存儲單元LPOOL的內容加載到PC中,但該存儲單元中保存的卻是鏈接時所決定的main函數入口的絕對地址,所以main函數實際所在的段不是位置無關。②位置無關的常量訪問。在應用程序中,經常要讀寫相關寄存器以完成必要的硬件初始化。為增強程序的可讀性,利用EQU偽指令對一些常量進行賦值,但在訪問過程中,必須實現位置無關性。下面以PXA270的GPIO初始化介紹位置無關的常量訪問方法。
GPIO_BASEEQU0x40e00000;
GPIO基址寄存器地址GPDR0EQU0x00c;相對于GPIO基址寄存器的偏移量
init_GPDR0EQU0xfffbfe00;寄存器GPDR0初值
LDRR1,=GPIO_BASE
LDRR0,=init_GPDR0
STRR0,[R1,#GPDR0]上述匯編代碼段經編譯后的結果為:
LDRR1,[PC,OFFSET_TO_GPIO_BASE]
LDRR0,[PC,OFFSET_TO_init_GPDR0]
STRR0,[R1,#0xc]
GPIO_BASEDCD0x40e00000
GPDR0DCD0x00c
init_GPDR0DCD0xfffbfe00可見見,,LDR偽指指令令實實際際上上使使用用基基于于PC的偏偏移移量量來來對對符符號號常常量量GPIO_BASE和init_GPDR0進行行引引用用,,因因而而是是位位置置無無關關的的。。由由此此可可以以得得出出如如下下結結論論::使使用用LDR偽指令將一個個常量讀取到到非PC的其他通用寄寄存器中可實實現位置無關關的常量訪問問;但將一個個地址值讀取取到PC中進行程序跳跳轉時,跳轉轉目標則是位位置相關的。。其他被ROPI段中的代碼引引用的必須是是絕對地址,,或者是基于于可讀寫位置置無關(RWPI)段的靜態(tài)基址址寄存器的可可寫數據。使用絕對地址址只能引用被被重定位到特特定位置的代代碼段中的符符號,通過在在位置無關代代碼中引入絕絕對地址,可可以讓程序跳跳轉到指定位位置。例如,,假設Bootloader的階段1將其自身代碼碼拷貝到鏈接接時所指定的的SDRAM地址空間后,,當要跳轉到到階段2的C程序入口時,,可以使用指指令“LDRPC,=main”跳轉到程序在在SDRAM中的main函數入口地址址開始執(zhí)行。。這是因為程程序在編譯鏈鏈接時給main函數分派絕對對地址,系統(tǒng)統(tǒng)通過將main函數的絕對地地址直接賦給給PC實現程序跳轉轉。如果使用用相對跳轉指指令“Bmain”,那么只會跳跳轉到啟動ROM內部的main函數入口。(2)程序設計計規(guī)范2在使用GNU工具開發(fā)Bootloader時,程序在鏈鏈接時會通過過一個鏈接腳腳本(linkerscript)來設定映像像文件的內存存映射。一個個簡單的鏈接接腳本結構如如下:OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS{.=BOOTADDR;/*Bootloader的起始地址*/__boot_start=.;.textALIGN(4):{/*代碼段.text*/*(.text)}2位置無關代碼碼在Bootloader設計中的應用用.dataALIGN(4):{/*數據段.data*/*(.data)}.gotALIGN(4):{/*全局偏移量表表.got段*/*(.got)}__boot_end=.;/*Bootloader映像文件的結結束地址*/.bssALIGN(16):{/*堆棧段.bss*/__bss_start=.;*(.bss)__bss_end=.;}}這里不再介紹紹鏈接腳本的的語法。需要要指出的是,,鏈接腳本中中所描述的輸輸出段地址為為虛擬地址VMA(VirtualMemoryAddress)。這里的“虛擬地址”僅指映像文件件執(zhí)行時,各各輸出段所重重定位到相應應的存儲地址址空間,與內內存管理無關關。因此,上上面的鏈接腳腳本實際上指指定了Bootloader映像在執(zhí)行時時,將被重定定位到BOOTADDR開始的存儲地地址空間,以以保證在相關關位置對符號號進行正確引引用,使程序序正常運行。。arm處理器復位后后總是從0x0地址取第1條指令,因此此只需把BOOTADDR設置為0,再把編譯后后生成的可執(zhí)執(zhí)行二進制文文件下載到ROM的0x0地址開始的存存儲空間,程程序便可正常常引導;但是是,一旦在鏈鏈接時指定映映像文件從0x0地址開始,那那么Bootloader就只能在0x0地址開始的ROM空間內運行,,而無法拷貝貝到SDRAM空間運行實現現快速引導。。當然,對PXA270等具有MMU功能的微處理理器來說,雖雖然可以先將將Bootloader映像整個拷貝貝到SDRAM中,再使用MMU功能將SDRAM空間映射到0x0地址,進而繼繼續(xù)在SDRAM中運行;但這這樣一方面會會使得Bootloader的設計與實現現復雜化,另另一方面在一一些必須屏蔽蔽MMU功能的應用中中(例如引導導armlinux系統(tǒng)),無法法使用MMU進行地址重映映射。利用ARM的基于位置無無關的程序設設計可以解決決上述問題。。只需在程序序鏈接時,將將BOOTADDR設置為SDRAM空間的地址((一般情況下下利用SDRAM中最高的1MB存儲空間作為為起始地址)),這樣arm處理器上電復復位后Bootloader仍然可以從地地址0開始執(zhí)行,并并將自身拷貝貝到指定的__boot_start起始的SDRAM中運行。實現現上述功能的的鏈接腳本所所對應的啟動動代碼架構如如下:.section.text.globl_start_start:Breset/*復位異常*//*其他異常處理理代碼*/reset:/*復位處理程序序*/copy_boot:/*拷貝Bootloader到SDRAM*/LDRR0,=0x0LDRR1,=__boot_startLDRR2,=__boot_end1:LDRMIAR0!,{R3-R10}STRMIAR1!,{R3-R10}CMPR1,R2BLT1bclear_bss:/*清零.bss段*/BLinit_Stack/*初始化堆堆棧*/LDRPC,=main/*跳轉到階階段2的C程序入口口*/.end程序入口口為_start,即復位位異常,,所有其其他異常常向量都都使用相相對跳轉轉指令B來實現,,以保證證位置無無關特性性。在完完成基本本的硬件件初始化化后,利利用鏈接接腳本傳傳遞過來來__boot_start和__boot_end的參數,,將Bootloader映像整個個拷貝到到指定的的SDRAM空間,并并清零.bss段,初始始化堆棧棧后,程程序將main函數入口口的絕對對地址賦賦給PC,進而跳跳轉到SDRAM中繼續(xù)運運行。程程序在跳跳轉到main函數之前前,所有有的代碼碼都在ROM中運行,,因而必必須要保保證代碼碼的位置置無關性性,所以以在調用用初始化化GPIO、存儲系系統(tǒng)和堆堆棧等子子程序時時,都使使用相對對跳轉指指令來完完成。①簡化化設計,,方便實實現系統(tǒng)統(tǒng)的快速速引導。。位置無無關代碼碼可以避避免在引引導時進進行地址址映射,,并方便便地跳轉轉到SDRAM中實現快快速引導導。②實現現復位處處理智能能化。由由于位置置無關代代碼可以以被加載載到任意意地址空空間運行行,因此此其運行行時的當當前地址址與鏈接接時所指指派的地地址并不不一定相相同。利利用這一一特性,,可以在在復位處處理程序序中使處處理器進進入SVC模式并關關閉中斷斷后加入入如下代代碼,便便可根據據當前運運行時的的地址進進行不同同的復位位處理::ADRR0,_start/*讀取當前前PC附近的_start標號所在在指令地地址*/LDRR1,=__boot_start/*讀取Bootloader在SDRAM的起始地地址*/CMPR0,R1BEQclear_bss使用位置置無關設設計Bootloader程序有如如下優(yōu)點點上述代碼碼中的ADR指令讀取取的_start標號地址址由指令令的執(zhí)行行地址決決定。若若是從SDRAM中的Bootloader啟動,則則上述比比較結果果相等,,程序直直接跳轉轉到clear_bss標號地址址處執(zhí)行行,這樣樣可以避避免存儲儲系統(tǒng)的的重新
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年呼倫貝爾職業(yè)技術學院單招職業(yè)傾向性測試題庫匯編
- 2025年度土地互換與農村土地制度改革合同
- 2025年度客戶價格保密與農業(yè)科技合作開發(fā)合同
- 2025年度工地食堂員工滿意度調查與提升承包合同
- 2025年度夫妻雙方子女撫養(yǎng)權及探望權離婚協(xié)議書
- 2025年度房屋贈予與遺產分配協(xié)議
- 2025年度大型活動臨時聘用保安人員合作協(xié)議
- 2025年度人工智能教育平臺建設合同變更協(xié)議
- 互聯(lián)網平臺限用農藥違規(guī)售賣現狀調研報告
- 2025年度總經理聘任與質量管理體系合同:提升產品質量合作協(xié)議
- 《中國古代文學史及作品選II》教學大綱
- 代工生產合同范本
- 瑜伽課程合同轉讓協(xié)議書范本
- 2005室外給水管道附屬構筑物閥門井05S502
- 人教版(2024)六年級全一冊 第16課 智能種植初探秘
- 初中班會 教師讀書分享《教師的語言力》 課件
- 導言中職專用《職業(yè)道德與法治》(高教版2023基礎模塊)
- 新教科版五年級下冊科學全冊每節(jié)課后練習+答案(共28份)
- ipsecvpn技術詳解
- 《醫(yī)隱》系列之《傷寒易玄》
- 理化生實驗操作訓練方案
評論
0/150
提交評論