虚拟地址 线性地址 物理地址 傻傻分不清楚?
Virtual address Linear address Physic address
先說說邏輯地址:
我們時常會看到一種地址的表述方式——segment:offset。比方0x0:0x7c2d
這里的地址表述方式是邏輯地址方式。在沒有開啟分段機制之前。物理地址的尋址通過這樣的方式。
相關的,segment:offset的組織形式,是virtual address,虛擬地址.真正的物理地址是通過segment<<4 + offset運算得到的.
線性地址:
分段機制開啟之后就是使用的線性地址了
例如說以下截圖中。那個mov 0x1001c %eax 中的0x1001c就是使用的偏移地址。數據段CS的偏移量,而<bootmain>旁邊的那個00007d0a也是地址,代碼段的偏移地址。當前obj文件代碼段CS內的偏移地址,“(CS:IP)始終指向下一條指令所處的地址”這句話里的地址就是代碼段內的偏移地址,下圖中的00007d0a,7d0b,7d0e。。。
這些都是代碼段的偏移地址,而 0x10000這些地址是當前數據段的偏移地址 ,$0x464c457fz僅僅是個馬上數
上述下劃線部分是近期update
第二次update: 把握住上面下劃線的分析。easy知道這里的偏移地址其能夠依據seg:offset解析做線性地址,進而依據分頁的機制,解析假設映射到物理地址
上述這個反匯編看到的截圖地址和我們平日寫hello world反匯編看到的地址無異。都是使用的線性地址。而因為普通的user space用戶一般都不會去接觸boot.S那段代碼。所以根本就沒有邏輯地址的“需求”.對于普通用戶來說。就兩種地址,要么這個地址是"假的" ,要么這個地址是“真的”,這里理解的假。真,都是因為對是否這個地址真正相應物理內存來說的。
因為用戶空間的線性地址不是真正相應的物理地址,所以人們就把這樣的地址也叫做虛擬地址
所才會有下圖(截取自CSAPP)的現象。明明是線性地址空間。被稱作虛擬內存空間.
自然的物理內存地址就不必說了.
之所以這么強調地址概念的區分.一是之前自己暈了好久,半吊子,似懂非懂.
再者,遇到一個問題,觸發我去把這個理清楚
看以下的截圖。這段代碼出自Xv6(MIT-JOS)的 /kern/pmap.h
第一個函數的功能說明是把“takes a kernel virtual address,returns the corresponding physical address”
這里說的把把虛擬地址轉換成物理地址就是把線性地址轉換成物理地址,
并且實現方法也論證了這一點, 直接的kva - KERNBASE ,這里KERNBASE是0xF0000000
而這里指的“物理地址”也不是別的IOport的地址,就是內存地址,內存的首地址被映射到KERNBASE
So ...如今就非常清楚了
第二個把物理內存地址轉換成線性地址就是直接把physical address加上 KERNBASE就可以 : -)
總結:
人們會easy混淆的原因在于直接把線性地址稱作虛擬地址了。這并沒有錯(聽線性地址的人也不多吧),對于大多數程序猿來說,都是接觸的線性地址,因為這個地址不是實際的物理地址。所以就習慣性的稱作虛擬地址了.使用范圍內也就是這個“虛擬地址”(例如說寫個C hello world,里面反匯編也就看到的是線性地址)。
大多數人不須要接觸到真正的物理地址。這里的概念就變成了對照性的了,不是物理地址的就是虛擬的。使用的是線性地址,因為"不須要那么多概念",于是就把虛擬地址和線性地址掛鉤了,并且這里早期的分段未開啟的時候虛擬地址的概念已經不存在了。這樣時候不會有重疊,于是大家都這么用了....
僅此個人學習總結,如有誤解望及時指正.
總結
以上是生活随笔為你收集整理的虚拟地址 线性地址 物理地址 傻傻分不清楚?的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: HTTP和HTTPS的了解
- 下一篇: antdesign的表单中的下拉框设置默
