虛擬內存怎麼映射到物理內存(什麼是虛擬內存)
2023-10-26 18:49:13 1
一、為什麼有虛擬內存?CPU是直接操作內存的物理地址,同時運行兩個程序可能會出現意想不到的結果。程序A在地址2000的位置寫入一個新的值,會擦掉程序B存放在相同位置上的內容。所以同時運行多個程序地址空間不隔離存在程序崩潰的風險。因此,有了虛擬內存。每個進程分配獨立的一套虛擬地址,互不幹涉。(虛擬地址由作業系統負責映射到物理內存)
二、虛擬內存地址與物理內存地址概念解釋作業系統會提供一種機制,將不同進程的虛擬地址和不同內存的物理地址映射起來。如果程序要訪問虛擬地址的時候,由作業系統轉換成不同的物理地址,這樣不同的進程運行的時候,寫入的是不同的物理地址,這樣就不會衝突了。
於是,這裡就引出了兩種地址的概念:
我們程序所使用的內存地址叫做虛擬內存地址(Virtual Memory Address)實際存在硬體裡面的空間地址叫物理內存地址(Physical Memory Address)。作業系統引入了虛擬內存,進程持有的虛擬地址會通過 CPU 晶片中的內存管理單元(MMU)的映射關係,來轉換變成物理地址,然後再通過物理地址訪問內存,如下圖所示:
1、內存分段
分段機制就是把虛擬地址空間中的虛擬內存組織成一些長度可變的稱為段的內存塊單元.邏輯地址包括一個段選擇符或一個偏移量,段選擇符是一個段的唯一標識,提供了段描述符表,段描述符表指段的大小、訪問權限和段的特權級、段類型以及段的第一個字節在線性地址空間中的位置(稱為段的基地址)。邏輯地址的偏移量部分 段的基地址就可以定位段中某個字節的位置。因此基地址加上偏移量就形成了處理器線性地址空間中的地址
2、內存分頁
分段的好處就是能產生連續的內存空間,但是會出現內存碎片和內存交換的空間太大的問題。在 Linux 下,每一頁的大小默認為 4KB。
如上圖,線性地址的最高10位(位31~22)用作一級表(頁目錄),有2的10次方個項,這些表項指向對應的二級表。第二級表稱為頁表(page table),二級頁表使用線性地址中間10位(位 21~12)作為表項索引值;簡單說,線性地址高10位(31~22)定位目錄項,( 21~12)定位頁表項 ,頁表項存儲了基地址,線性地址低12位存儲了偏移量, 組合在一起就得到了分頁轉換過程的輸出值,即對應的最終物理地址
,