漫畫解說 “記憶體對映”
虛擬記憶體空間與物理記憶體空間
虛擬記憶體地址就好比每個班的學號,而物理記憶體地址就好比真實的學生。因為每個學號都對應不同的學生,所以虛擬記憶體地址也要對映到物理記憶體地址。
虛擬記憶體與物理記憶體的對映關係是透過
頁表
來關聯的,如下圖:
但
頁表
並不是按位元組來進行對映的,而是按照
記憶體頁
為單位進行對映,一般一個
記憶體頁
的大小為 4KB(為什麼要加一般呢,這是因為除了4KB,還有其他大小的記憶體頁,如2MB,4MB,1GB等),
頁表
的每一個
頁表項
都儲存著物理記憶體頁的地址。
所以,4GB 的虛擬記憶體空間需要 1MB 大小的頁表來關聯(因為 4GB / 4KB = 1MB)。也就是說,0 ~ 4095 的虛擬記憶體地址都是使用
頁表
的第一個
頁表項
來對映的,而 4096 ~ 8191 的虛擬記憶體地址使用
頁表
的第二個
頁表項
來對映的,以此類推。。。
那麼,透過什麼樣的演算法能把 0 ~ 4095 的虛擬記憶體地址轉換為頁表的第一個頁表項呢?其實很簡單,只需要把虛擬記憶體地址的高階 20 位作為頁表的索引,而把低端 12 位作為記憶體頁中的偏移量即可,如下圖:
在上圖中,還看到了一個
cr3
的東西,這是 CPU 中的一個暫存器,用於儲存
頁表
的物理記憶體地址,透過這個暫存器就能找到程序的
頁表
了。
現在對記憶體對映的原理有了比較清晰的瞭解了,但現在有個問題,每個程序都要 1MB 大小的頁表,那不是很浪費記憶體嗎?的確是,因為程序很多虛擬記憶體地址並不會用到,為了節省頁表使用的記憶體,x86 CPU 把頁表分為 2 級,如下圖:
如上圖所示,把原來的
頁表
劃分為
頁目錄
和
頁表
,它們的大小均為 4KB。而虛擬記憶體地址的高 10 位作為頁目錄的索引,而中間 10 位作為頁表的索引,低 12 位還是作為物理記憶體頁的偏移量。
把原來的
頁表
劃分為兩級後,程序有些不使用的虛擬記憶體地址就不需要進行對映,從而節省了記憶體的使用。
上一篇:說說仙家上身的感覺