lec 07 作業系統管理頁表對映
0 Contents
1 作業系統設定頁表對映
何時設定頁表對映?
-
作業系統自己使用的頁表
-- 在啟動時填寫
-- 對映全部實體記憶體- 虛擬地址 = 實體地址 + 固定偏移(直接對映,Direct Mapping)
- 思考:為什麼需要直接對映?
-
應用程序的頁表
-- 何時設定?
2 立即對映
- 建立程序時,OS按照虛擬記憶體區域填寫程序頁表
-- 例如,程式碼段和資料段
-- 具體步驟:- 步驟-1: 分配物理頁(alloc_page)
- 步驟-2: 把應用程式碼/資料從磁碟載入到物理頁中
- 步驟-3: 新增虛擬頁到物理頁的對映(add_mapping)
- 步驟-4: 未載入完畢,回到步驟-1
分配物理頁的簡單實現
作業系統用點陣圖記錄物理頁是否空閒
0:空閒;1:已分配
OS填寫頁表基地址
結構體儲存頁表的基地址
填寫程序頁表
!直接對映弊端
-
立即對映是一種作業系統可以選擇的頁表填寫策略
-- 在初始化程序虛擬地址空間時,直接在程序頁表中新增各虛擬記憶體區域的對映 -
潛在弊端
-- 以關卡/副本型別遊戲載入為例:只玩1關,載入1000關- 實體記憶體資源浪費
- 非必要時延
3 延遲對映
想法
-
解決立即對映弊端的直觀想法
-- 作業系統按程序實際需要分配物理頁和填寫頁表,避免分配的物理頁實際不被用到的情況 -
主要思路:解耦虛擬記憶體分配與實體記憶體分配
-- 先記錄下為程序分配的虛擬記憶體區域
-- 當程序實際訪問某個虛擬頁時,CPU 會觸發缺頁異常
-- 作業系統在缺頁異常處理函式中新增對映
作業系統需要區分合法/非法缺頁異常
執行以下程式碼,作業系統可以發現segmentation fault
。
#include<stdio.h>
int main()
{
char *p = NULL;
printf("%s\n",p);
return 0;
}
作業系統記錄為程序分配的虛擬記憶體區域
- 虛擬地址空間
-- 若干非連續的虛擬記憶體區域- 每個虛擬記憶體中虛擬地址都是程序可用的,具有相同的訪問許可權。
- 例如:程式碼,資料,堆,棧
- 訪問非法虛擬地址會觸發CPU異常,作業系統將會跑出segmentation fault。
合法虛擬地址資訊的記錄方式
- 記錄程序已經分配的虛擬記憶體區域
-- Linux: 對應結構體vm_area_struct
,位於linux/include/linux/mm_types.h
內定義。
(有意思的是,虛擬記憶體在linux內出現是在2008年)。
-- Chcore: 對應以下的結構體。
VMA 新增方式
1.OS建立程序時分配
- 資料(對應ELF檔案的資料段)
- 程式碼(對應ELF檔案的程式碼段)
- 棧(初始沒有內容)
2.程序執行時新增
- 堆,棧
- mmap/munmap
-- 分配記憶體buffer和載入新的程式碼庫
mmap: 分配一段虛擬記憶體區域
- 通常用於把一個檔案或一部分對映到記憶體
- 也可以不對映任何檔案,僅僅新建虛擬記憶體區域(匿名對映)
linux:
示例
執行mmap後,vma發生變化
mmap 對映檔案
VMA如何新增
- 途徑2: 程序執行時新增/應用程式主動向OS發起系統呼叫
-- mmap()- 申請空的虛擬記憶體區域
- 申請對映檔案資料的虛擬記憶體區域
-- brk():擴大、縮小堆區域
-- 棧VMA的可選策略 - OS為程序初始分配固定大小的棧VMA,在發現stackoverflow之後自動擴大棧VMA
-- 使用者態的malloc(API)也可能改變VMA - 呼叫brk,在堆中分配新的記憶體
- 呼叫mmap分配較大區域
VMA判斷缺頁異常的合法性
-
缺頁異常(page fault)
-- AARCH64:觸發(通用的)同步異常(8)
-- 根據ESR資訊判斷是否為缺頁異常
-- 訪問的虛擬地址存放在FAR_EL1 -
作業系統的缺頁處理函式
-- FAR_EL1中的值不落在VMA區域內,則為非法
-- 反之,則分配物理頁,並在頁表中新增對映
延遲對映與立即對映對比
- 優勢:節約記憶體資源
- 劣勢:卻頁異常導致訪問延遲增加
- tradeoff:
-- 應用程式具有時空區域性性
-- 缺頁異常處理中採用預先對映策略。節約記憶體並且減少缺頁異常次數。
OS嚮應用提供靈活的記憶體管理系統呼叫
4 虛擬記憶體的擴充套件功能
1.共享記憶體
節約記憶體與程序通訊作用。
2.寫時複製
實現:修改頁表項許可權,在缺頁時複製,恢復。
fork:節約實體記憶體,效能加速。
3.記憶體去重
- memory deduplication
-- 基於寫時複製機制
-- 在記憶體中掃描,發現具有相同內容的物理頁面
-- 執行去重
-- 作業系統發起,對使用者態透明
4.記憶體壓縮
- 基本思想
-- 當記憶體資源不充足的時候, 選擇將一些“最近不太會使用”的記憶體頁進行資料壓縮,從而釋放出空閒記憶體
大頁的利弊
- 好處
-- 減少TLB快取項的使用,提高 TLB 命中率
-- 減少頁表的級數,提升遍歷頁表的效率 - 案例
-- 提供API允許應用程式進行顯示的大頁分配
-- 透明大頁(Transparent Huge Pages) 機制 - 弊端
-- 未使用整個大頁而造成實體記憶體資源浪費
-- 增加管理記憶體的複雜度