您當前的位置:首頁 > 動漫

漫畫解說 “記憶體對映”

作者:由 Jayden 發表于 動漫時間:2021-04-27

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

虛擬記憶體空間與物理記憶體空間

漫畫解說 “記憶體對映”

虛擬記憶體地址就好比每個班的學號,而物理記憶體地址就好比真實的學生。因為每個學號都對應不同的學生,所以虛擬記憶體地址也要對映到物理記憶體地址。

漫畫解說 “記憶體對映”

漫畫解說 “記憶體對映”

虛擬記憶體與物理記憶體的對映關係是透過

頁表

來關聯的,如下圖:

漫畫解說 “記憶體對映”

頁表

並不是按位元組來進行對映的,而是按照

記憶體頁

為單位進行對映,一般一個

記憶體頁

的大小為 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 位還是作為物理記憶體頁的偏移量。

把原來的

頁表

劃分為兩級後,程序有些不使用的虛擬記憶體地址就不需要進行對映,從而節省了記憶體的使用。