物理地址,虛擬地址,鏈接地址的個人理解

以下僅爲個人理解,若有不足之處,望指正。

鏈接地址,物理地址,虛擬地址這三者地址都有各自的區別,這也是我開發學習過程中,自己琢磨出來領悟的,網上搜索的都講的很專業化,不太好理解,理解起來感覺有些吃力。所以我想以個人理解的角度,通俗點去講講這三者的功能作用。


物理地址

比較簡單,就是存儲器內(SRAM,SDRAM)分配的真實地址,2440的SRAM前4KB的物理地址是:0x00000000~0x00400000。SDRAM的起始物理地址是0x30000000。
有彙編基礎的知道,程序運行流程受PC指針控制,PC指針指向哪個地址,程序就會去這個地址執行
通常情況,沒有虛擬地址存在情況,這個PC訪問的地址就是物理地址,PC直接指向這個物理地址,在存儲器內執行相關代碼指令,控制寄存器等動作。


虛擬地址

有時如果程序量過大,存儲器內存無法滿足程序運行,而內存裏某些物理地址是可以被一些不同的程序指令共用,因此爲提高內存的利用,採用虛擬內存地址的思想,該虛擬地址容量要大於實際物理地址容量,程序執行時是在虛擬地址上運行,也就是PC指針指向的是虛擬地址。但是虛擬地址運行是控制不了實際存在的物理地址,從而那些寄存器無法被控制。因此需要一個地址映射器(翻譯器),將虛擬地址映射到對應的物理地址上(其中多個虛擬地址可對應到同一個物理地址),從而對物理地址進行控制。這個地址映射器叫做“內存管理單元(MMU)”。不是所有芯片都存在這樣的單元,而2440內部具有這個單元功能,因此可以採用虛擬地址的思想來運行程序。32位的2440可以建立虛擬內存空間爲:0~2^32=0~4GB


鏈接地址

感覺不是很好理解,我感覺它也一種虛擬存在的地址,但又不完全是。在makefile文件中定義完鏈接地址後,如:

arm-linux-ld -Ttext 0x3000000 -g -o led_on_elf  crt0.o led_lighton.o

然後執行make進行編譯和鏈接,鏈接後生成最終的可執行文件led_on_elf ,這個文件第一條指令代碼會賦予給它一個鏈接首地址,就是0x3000000 ,第二條指令後,依次往上。這時程序還沒燒錄到芯片中,但每條指令都有對應一個鏈接地址標號,在程序燒錄到芯片後,程序仍然是按PC指向的物理或者虛擬地址進行執行(PC首地址爲程序燒到芯片裏的首地址)。此時鏈接地址僅是個每條指令的標號,沒有產生作用,只有當在指令中直接對PC進行賦值時,如:ldr pc,=main。那麼程序就會尋找到main函數對應的地址標號,把這個地址標號,也就是鏈接地址賦值給PC,此後PC運行的地址就跟着鏈接地址執行下去,鏈接地址就等於PC運行地址,鏈接地址就跟物理(虛擬)地址同步。(或者:ldr pc,=0x30000010,PC就會跳轉到鏈接地址爲0x30000010的地方去運行,0x30000010也就成了物理(虛擬)地址)
所以,我覺得把這鏈接地址叫做代碼的地址標號更形象一些。只有當執行對PC賦值時,才能達到位置改變的效果,鏈接地址就會被讀出而產生作用。否則,程序上電,PC還是默認按代碼在芯片裏的首地址去運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章