您現在的位置是:首頁 > 舞蹈首頁舞蹈

Linux記憶體對映的原理

由 yuanwufan 發表于 舞蹈2021-07-07
簡介核心會檢查負責缺頁區域的程序地址空間資料結構,找到適當的後備儲存器,或者確認該訪問實際上是不正確的(未對映,未使用)分配物理記憶體頁,並從後備儲存器讀取所需資料填充

開對映是不是一定連續

由於所有使用者程序總的虛擬地址空間比可用的物理記憶體大很多,因此只有最常用的部分才與物理頁幀關聯。這不是問題,因為大多數程式只佔用實際可用記憶體的一小部分。

在將磁碟上的資料對映到程序的虛擬地址空間的時,核心必須提供資料結構,以建立虛擬地址空間的區域和相關資料所在位置之間的關聯。例如,在對映文字檔案時,對映的虛擬記憶體區必須關聯到檔案系統的硬碟上儲存檔案內容的區域。如圖所示:

Linux記憶體對映的原理

當然,給出的是簡化的圖,因為檔案資料在硬碟上的儲存通常並不是連續的,而是分佈到若干小的區域。核心利用address_space資料結構,提供一組方法從後備儲存器讀取資料。例如,從檔案系統讀取。因此address_space形成了一個輔助層,將對映的資料表示為連續的線性區域,提供給記憶體管理子系統。

按需分配和填充頁稱為按需調頁法。它基於處理器和核心之間的互動,使用的各種資料結構如圖所示:

Linux記憶體對映的原理

過程如下:

CPU將一個虛擬記憶體空間中的地址轉換為物理地址,需要進行兩步(如下圖):

首先,將給定一個邏輯地址(其實是段內偏移量,這個一定要理解!!!),CPU要利用其段式記憶體管理單元,先將為個邏輯地址轉換成一個執行緒地址,

其次,再利用其頁式記憶體管理單元,轉換為最終物理地址。

Linux記憶體對映的原理

網路圖片

這樣做兩次轉換,的確是非常麻煩而且沒有必要的,因為直接可以把線性地址抽像給程序。之所以這樣冗餘,完全是為了相容而已。

程序試圖訪問使用者地址空間中的一個記憶體地址,利用上面的線性地址去查詢頁表,確定對應的物理地址,但使用的頁表無法確定物理地址(物理記憶體中沒有關聯頁)

處理器接下來觸發一個缺頁異常,傳送到核心。

核心會檢查負責缺頁區域的程序地址空間資料結構,找到適當的後備儲存器,或者確認該訪問實際上是不正確的(未對映,未使用)

分配物理記憶體頁,並從後備儲存器讀取所需資料填充。

藉助於頁表將物理記憶體頁併入到使用者程序的地址空間,應用程式恢復執行。

這些操作對使用者程序是透明的。換句話說,程序不會注意到頁是實際在物理記憶體中,還是需要透過按需調頁載入。

Linux記憶體對映的原理

在整個過程中可能需要解決以下幾個問題:

1)系統如何感知程序當前所需頁面不在主存(

頁表機制

);

2)當發現缺頁時,如何把所缺頁面調入主存(

缺頁中斷機構

);

3)在置換頁面時,根據什麼策略選擇欲淘汰的頁面(

置換演算法

)。

頁表機制

Linux記憶體對映的原理

狀態位(中斷位):標識該頁是否在記憶體(0或1);

訪問位:標識該頁面的近來的訪問次數或時間(換出);

修改位:標識此頁是否在記憶體中被修改過;

外存地址:記錄該頁面在外存上的地址,即(外存而非記憶體的)物理塊號。

缺頁中斷機制

程式在執行時,首先檢查頁表,當狀態位指示該頁不在主存時,則引起一個缺頁中斷髮生,其中斷執行過程與一般中斷相同:

保護現場(CPU環境);

中斷處理(中斷處理程式裝入頁面);

恢復現場,返回斷點繼續執行。

置換演算法

FIFO

LRU

LFU

感謝各位支援,點選螢幕右上角的【關注】每天文章不落下。感激不盡!

本頭條號文章分類目錄(精心整理)