運行地址和加載地址

運行地址和加載地址

ID:10278117

大?。?07.00 KB

頁數(shù):4頁

時間:2018-06-14

運行地址和加載地址_第1頁
運行地址和加載地址_第2頁
運行地址和加載地址_第3頁
運行地址和加載地址_第4頁
資源描述:

《運行地址和加載地址》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在行業(yè)資料-天天文庫。

1、U-Boot移植過程中的運行地址和裝載地址的區(qū)別uboot移植涉及到底層硬件的設置,因此需要掌握UART、系統(tǒng)時鐘頻率、NORFLASH、NANDFLASH、SDRAM、網(wǎng)卡、存儲控制器等硬件的功能及配置,這些都可以參照相應開發(fā)板的芯片手冊來完成,沒有什么大的問題。在移植過程中,一直困擾我的是PIC(代碼無關性)問題,即運行地址和加載地址的區(qū)別,看過網(wǎng)上很多關于這兩者的介紹,感覺懂一點,卻一直不知所然。在參考大量的文獻下,算是得了一點心得。首先來了解下運行地址及加載地址的區(qū)別運行地址:也叫鏈接地址,是程序定位的絕對地址,即在編譯連接時確定的地址。

2、如果程序中有位置相關指令,程序在運行時,程序必須在運行地址上。加載地址:程序放置的位置。運行地址和加載地址的值有時相等,有時卻不相等,所以這給初學者帶來很大的困擾。為了弄清楚這個問題,還得從NORFLASH,NANDFLASH,S3C2440內(nèi)部4KBRAM的映射說起。左邊表示從NORFLASH啟動時的映射,右邊表示從NANDFLASH啟動時的映射。這里只討論從NORFLASH啟動的情況,從圖中可以看出NORFLASH映射到了0X00000000的起始位置,假如UBOOT的代碼存放在NORFLASH上,即裝載地址為0X00000000。再來看看U

3、BOOT的鏈接地址,代碼在board/smdk2410/U-Boot.lds里。連接腳本文件lds中沒有設置LMA,只是設置了VMA。VMA的設置是通過頂層目錄下的config.mk文件中的LDFLAGS實現(xiàn)的在board/smdk2410/config.mk定義了TEXT_BASE=0x33F80000(SDRAM),即程序的運行地址查看u-boot.map文件,代碼的連接地址是從0x33F80000開始的。167.text0x33f800000x232c8168cpu/arm920t/start.o(.text)169.text0x33f80

4、0000x4a0cpu/arm920t/start.o1700x33f80048_bss_start1710x33f8004c_bss_end1720x33f80044_armboot_start1730x33f80000_start174board/samsung/fs2410/lowlevel_init.o(.text)175.text0x33f804a00x64board/samsung/fs2410/lowlevel_init.o1760x33f804a4lowlevel_init177board/samsung/fs2410/nand_

5、read.o(.text)178.text0x33f805040xe8board/samsung/fs2410/nand_read.o1790x33f80504wait_idle1800x33f80518nand_read_ll此時裝載地址和運行地址明顯不一樣,為什么程序還能運行呢?這里就涉及到PIC----代碼無關設計方面的知識了。在匯編語言中,像bl、b、adr(adr屬于偽指令,一般被編譯器解釋成sub指令)指令屬于位置無關指令,不管程序裝載在哪個位置上,bl、b、adr指令都能正確的運行,其原因是bl、b、adr指令的地址域是基于PC的相

6、對偏移尋址,相當于[pc+offset]。當ARM啟動時,ARM自動取0x00000000位置上的指令,此時PC=0x00000000。基于PC偏移量的指令都能正確的執(zhí)行。所以uboot第一階段指令都能執(zhí)行的原因在于此。但我們回顧一下u-boot的啟動過程中的第一階段有將u-boot代碼復制到SDRAM中,并跳到SDRAM中去運行,因為SDRAM映射到了BANK6,其地址為0x30000000,此時uboot代碼的地址范圍從TEXT_BASE----TEXT_BASE+size(u-boot),程序是如何跳轉(zhuǎn)的呢?跳轉(zhuǎn)到SDRAM為何還能運行呢?

7、這里就需要看下cpu/arm920t/start.S中的relocate標號。relocate:把norflash中的代碼復制到_TEXT_BASE處,在board/smdk2410/config.mk定義了TEXT_BASE=0x33F80000,這個地址屬于BANK6的范圍。也就是把代碼復制到從_TEXT_BASE地址開始的SDRAM中,當然在復制之前是要初始化SDRAM的,要不然SDRAM沒法使用。至此,代碼已復制到SDRAM中,那么就要跳到SDRAM中去運行,跳轉(zhuǎn)之前要做stack設置,清BSS,這些就不說了。下面來說如何跳轉(zhuǎn)的,請看下面

8、這條指令。ldrpc,_start_armbootldr偽指令中目的寄存器如果是pc,則ldr是與位置相關的指令,u-boot.map文

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。