以下僅為個人理解,若有不足之處,望指正。
鏈結位址,實體地址,虛擬位址這三者位址都有各自的區別,這也是我開發學習過程中,自己琢磨出來領悟的,網上搜尋的都講的很專業化,不太好理解,理解起來感覺有些吃力。所以我想以個人理解的角度,通俗點去講講這三者的功能作用。
比較簡單,就是儲存器內(sram,sdram)分配的真實位址,2440的sram前4kb的實體地址是:0x00000000~0x00400000。sdram的起始實體地址是0x30000000。
有彙編基礎的知道,程式執行流程受pc指標控制,pc指標指向哪個位址,程式就會去這個位址執行。
通常情況,沒有虛擬位址存在情況,這個pc訪問的位址就是實體地址,pc直接指向這個實體地址,在儲存器內執行相關**指令,控制暫存器等動作。
有時如果程式量過大,儲存器記憶體無法滿足程式執行,而記憶體裡某些實體地址是可以被一些不同的程式指令共用,因此為提高記憶體的利用,採用虛擬記憶體位址的思想,該虛擬位址容量要大於實際實體地址容量,程式執行時是在虛擬位址上執行,也就是pc指標指向的是虛擬位址。但是虛擬位址執行是控制不了實際存在的實體地址,從而那些暫存器無法被控制。因此需要乙個位址對映器(翻譯器),將虛擬位址對映到對應的實體地址上(其中多個虛擬位址可對應到同乙個實體地址),從而對實體地址進行控制。這個位址對映器叫做「記憶體管理單元(mmu)」。不是所有晶元都存在這樣的單元,而2440內部具有這個單元功能,因此可以採用虛擬位址的思想來執行程式。32位的2440可以建立虛擬記憶體空間為:0~2^32=0~4gb
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還是預設按**在晶元裡的首位址去執行。
邏輯位址 實體地址 虛擬位址
用於記憶體晶元級的單元定址,與處理器和cpu連線的位址匯流排相對應。雖然可以直接把實體地址理解成插在機器上那根記憶體本身,把記憶體看成乙個從0位元組一直到最大空量逐字節的編號的大陣列,然後把這個陣列叫做實體地址,但是事實上,這只是乙個硬體提供給軟體的抽像,記憶體的定址方式並不是這樣。所以,說它是 與...
虛擬位址與實體地址
乙個程式編譯連線後形成的位址空間是乙個虛擬位址空間,但是程式最終還是要執行在物理記憶體中。因此,應用程式所給出的任何虛位址最終必須被轉化為實體地址,所以,虛擬位址空間必須被對映到物理記憶體空間中,這個對映關係需要通過硬體體系結構所規定的資料結構來建立。這就是我們所說的段描述符表和頁表,linux主要...
實體地址和邏輯位址(虛擬位址)
1.實體地址 實體地址是載入到記憶體位址暫存器中的位址,是指記憶體中各物理儲存單元的位址從統一的基位址進行的順序編址。又稱絕對位址,它是資料在記憶體單元的真正位址。在前端匯流排上傳輸的記憶體位址都是物理記憶體位址,編號從0開始一直到可用物理記憶體的最高端。這些數字被北橋 nortbridge chi...