資源描述:
《運行地址和加載地址》由會員上傳分享,免費在線閱讀,更多相關內(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文