[轉]連接地址問題

轉自http://blog.csdn.net/ouyang_linux007/article/details/7448505linux

程序從片內地址0開始,但爲何連接地址又設0x30000000,那不就從0x30000000開始了,反彙編能夠看到不是從0開始的

韋老大回答:spa

1. 裸板程序燒在FLASH上
   一上電,確定從0地址運行
2. 可是,0地址要麼對應NOR FLASH,要麼對應只有4K的片內內存
3. 程序要讀寫數據,或是程序大於4K,怎麼辦?
4. 程序就要複製到SDRAM裏去執行
5. SDRAM那麼大,複製到哪一個地址去?能隨便選擇地址嗎
6. 不能,要複製到它的連接地址去
7. 爲何必定要複製到它的連接地址去?
8. 由於這個連接地址是程序運行時「應該位於的地方」,好比要訪問某個全局變量時,就是訪問這個全局變量的連接地址
9. 既然連接地址是SDRAM的地址,那爲何一開始程序能夠從0地址運行
10. 由於一開始的程序是「位置無關碼」
.net

獨孤君回答:blog

如下是我本身總結的,看對你有幫助不
加載時域與運行時域:能夠這麼理解,加載時域涉及到存儲地址;運行時域涉及到鏈接地址(鏈接地址開始做用的時間是在使用僞指令ldr(adr、adrl)pc,=某符號或是某當即數時 )。可執行程序在被下載到相應存儲器件裏時,它的存儲地址能夠經過oflash來選擇;而當運行該程序時,一開始時PC寄存器的值是指向存儲空間的起始地址(起始地址由oflash決定)的,但 在遇到僞指令ldr(adr、adrl)pc,=某符號或是某當即數(位置無關相對跳轉指令B與BL不影響運行地址)後,程序運行時的絕對地址(即PC寄 存器的值)就發生了改變,它是以鏈接地址(由arm-linux-ld之-T選項設定)爲基址,指令所在位置爲相對地址共同組成的總之:運行地址=-T指定的鏈接地址+相對偏移地址;存儲地址=由oflash指定某存儲器件的起始地址+由連接文件中AT指定的加載地址
內存

相關文章
相關標籤/搜索