到底什么是虛擬地址呢?它和物理地址的區別又在哪呢?
一. 虛擬地址的作用
1. 使代碼的移植性更好,在不同平臺進行編譯以后,就可以直接運行,因為到別的系統,會將你的虛擬地址轉換為物理地址,而使用的物理地址,那就得考慮這塊物理地址是否被別人使用了
2. 不需要考慮內存分配的問題。
3. 虛擬地址映射的不一定是物理地址,還可能是硬盤上的某一塊地方
二. 虛擬地址和物理地址是怎么映射的呢?
進程想要訪問真正的物理地址,首先要先將虛擬地址轉換為線性地址,然后經過MMU就可以將線性地址轉換為真正的物理地址。
而虛擬地址和線性地址是如何進行轉換的呢:
轉換過程中,需要段寄存器,段寄存器中存儲的是描述表的索引。描述符中存放基地址,通過基地址加上虛擬地址這個偏移量就可算出線性地址了。而在linux系統中,虛擬地址和線性地址是相等的。
而線性地址和物理地址是如何進行轉換的呢:
1.從CR3寄存器中取出頁目錄的地址。
2.根據線性地址中的前10位,找到頁目錄的索引。
3.根據頁目錄項的值與中間10位相加后得到頁表中的索引。
4.將頁的起始地址與最后的12位相加后得到最終的物理地址。
通過線性地址找到頁目錄中的頁表,然后找到頁表中的頁表項,最終通過頁表項和線性地址中的偏移,來找到最終的物理地址。