Linux作業系統之記憶體管理

2021-10-08 21:25:38 字數 2513 閱讀 4950

作業系統的記憶體管理,主要分為三個方面

乙個記憶體管理系統至少應該做三件事情:

檢視程序記憶體空間的布局的命令:cat /proc/程序id/maps

分段機制的原理

linux 傾向於另外一種從虛擬位址到實體地址的轉換方式,稱為分頁(paging)

虛擬記憶體中的頁通過頁表對映為物理記憶體中的頁。

把記憶體管理系統精細化為下面三件事情:

整個虛擬記憶體空間要一分為二,一部分是使用者態位址空間,一部分是核心態位址空間.

當 exec 執行乙個二進位制程式的時候,除了解析 elf 的格式之外,另外乙個重要的事情就是建立記憶體對映。

load_elf_binary 會完成以下的事情:記憶體對映圖

核心態的虛擬空間和某乙個程序沒有關係,所有程序通過系統呼叫進入到核心之後,看到的虛擬位址空間都是一樣的。

乙個程序要執行起來需要以下的記憶體結構核心態:

程序執行狀態在 32 位下對應關係

程序執行狀態在 64 位下對應關係

dma 是這樣一種機制:要把外設的資料讀入記憶體或把記憶體的資料傳送到外設,原來都要通過 cpu 控制完成,但是這會占用 cpu,影響 cpu 處理其他事情,所以有了 dma 模式。cpu 只需向 dma 控制器下達指令,讓 dma 控制器來處理資料的傳送,資料傳送完畢再把資訊反饋給 cpu,這樣就可以解放 cpu。

對於物理記憶體來講,從下層到上層的關係及分配模式如下

核心執行緒kswapd。這個核心執行緒,在系統初始化的時候就被建立。這樣它會進入乙個無限迴圈,直到系統停止。在這個迴圈中,如果記憶體使用沒有那麼緊張,那它就可以放心睡大覺;如果記憶體緊張了,就需要去檢查一下記憶體,看看是否需要換出一些記憶體頁。

記憶體管理並不直接分配物理記憶體,因為物理記憶體相對於虛擬位址空間太寶貴了,只有等你真正用的那一刻才會開始分配。

四級頁表的概念

乙個程序的虛擬位址空間包含使用者態和核心態兩部分。為了從虛擬位址空間對映到物理頁面,頁表也分為使用者位址空間的頁表和核心頁表。在核心裡面,對映靠核心頁表,這裡核心頁表會拷貝乙份到程序的頁表。

頁表一般都很大,只能存放在記憶體中。作業系統每次訪問記憶體都要折騰兩步,先通過查詢頁表得到實體地址,然後訪問該實體地址讀取指令、資料。

tlb(translation lookaside buffer),我們經常稱為快表專門用來做位址對映的硬體裝置。它不在記憶體中,可儲存的資料比較少,但是比記憶體要快。所以,我們可以想象,tlb 就是頁表的 cache,其中儲存了當前最可能被訪問到的頁表項,其內容是部分頁表項的乙個副本。

有了 tlb 之後,位址對映的過程就像圖中畫的。我們先查塊表,塊表中有對映關係,然後直接轉換為實體地址。如果在 tlb 查不到對映關係時,才會到記憶體中查詢頁表。

使用者態的記憶體對映機制包含以下幾個部分

整個記憶體管理的體系

作業系統之記憶體管理

記憶體管理的功能有 1 空間分配與 2 位址轉換 3 空間擴充 4 儲存保護 將資料與程式裝入記憶體分以下步驟 1 編譯成模組 2 鏈結模組 分靜態 裝入時動態 執行時動態鏈結 3 將模組裝入記憶體 分絕對裝入 可重定位裝入 執行時動態裝入 邏輯位址與實體地址 訪問資料時是使用實體地址獲取資料,多個...

作業系統之記憶體管理

位址對映和重定位是乙個概念 適應於請求段的記憶體分配方法是最佳適應和可變分割槽 可重入 reentrant code 又稱為 純 purecode 是一種允許多個程序同時訪問的 為使各個程序所執行的 完全相同,絕對不允許可重入 在執行中有任何改變。目的 擴充主存容量 最基本的特徵 多次性 最主要的技...

作業系統之記憶體管理

便於程式設計師編寫程式 分治 可以控制每個段的許可權 寫 讀 符合跳轉指令邏輯 段號,段內偏移 執行時重定位 當執行某條指令時才進行位址重定位,先查詢程序pcb指向的段表,然後根據偏移量算出實體地址。編譯時重定位 編譯時就把所有跳轉指令進行重定位。缺點 導致必須使用重定位後的那一段記憶體,若那一段記...