Lec 07 作業系統管理頁表對映

木木ちゃん發表於2024-11-12

lec 07 作業系統管理頁表對映

0 Contents

a

1 作業系統設定頁表對映

a

何時設定頁表對映?

  • 作業系統自己使用的頁表
    -- 在啟動時填寫
    -- 對映全部實體記憶體

    • 虛擬地址 = 實體地址 + 固定偏移(直接對映,Direct Mapping)
    • 思考:為什麼需要直接對映?
  • 應用程序的頁表
    -- 何時設定?

2 立即對映

  • 建立程序時,OS按照虛擬記憶體區域填寫程序頁表
    -- 例如,程式碼段和資料段
    -- 具體步驟:
    • 步驟-1: 分配物理頁(alloc_page)
    • 步驟-2: 把應用程式碼/資料從磁碟載入到物理頁中
    • 步驟-3: 新增虛擬頁到物理頁的對映(add_mapping)
    • 步驟-4: 未載入完畢,回到步驟-1

a

分配物理頁的簡單實現

作業系統用點陣圖記錄物理頁是否空閒
0:空閒;1:已分配

a

OS填寫頁表基地址

結構體儲存頁表的基地址

a

a

a

填寫程序頁表

a

a

a

!直接對映弊端

  • 立即對映是一種作業系統可以選擇的頁表填寫策略
    -- 在初始化程序虛擬地址空間時,直接在程序頁表中新增各虛擬記憶體區域的對映

  • 潛在弊端
    -- 以關卡/副本型別遊戲載入為例:只玩1關,載入1000關

    • 實體記憶體資源浪費
    • 非必要時延

3 延遲對映

想法

  • 解決立即對映弊端的直觀想法
    -- 作業系統按程序實際需要分配物理頁和填寫頁表,避免分配的物理頁實際不被用到的情況

  • 主要思路:解耦虛擬記憶體分配與實體記憶體分配
    -- 先記錄下為程序分配的虛擬記憶體區域
    -- 當程序實際訪問某個虛擬頁時,CPU 會觸發缺頁異常
    -- 作業系統在缺頁異常處理函式中新增對映

a

a

作業系統需要區分合法/非法缺頁異常

執行以下程式碼,作業系統可以發現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內定義。

a

(有意思的是,虛擬記憶體在linux內出現是在2008年)。

-- Chcore: 對應以下的結構體。

a

a

VMA 新增方式

1.OS建立程序時分配

  • 資料(對應ELF檔案的資料段)
  • 程式碼(對應ELF檔案的程式碼段)
  • 棧(初始沒有內容)

2.程序執行時新增

  • 堆,棧
  • mmap/munmap
    -- 分配記憶體buffer和載入新的程式碼庫

a

mmap: 分配一段虛擬記憶體區域

  • 通常用於把一個檔案或一部分對映到記憶體
  • 也可以不對映任何檔案,僅僅新建虛擬記憶體區域(匿名對映)

linux:

a

示例

a

執行mmap後,vma發生變化

a

a

mmap 對映檔案

a

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嚮應用提供靈活的記憶體管理系統呼叫

a

4 虛擬記憶體的擴充套件功能

1.共享記憶體

節約記憶體與程序通訊作用。

2.寫時複製

a
實現:修改頁表項許可權,在缺頁時複製,恢復。
fork:節約實體記憶體,效能加速。

3.記憶體去重

  • memory deduplication
    -- 基於寫時複製機制
    -- 在記憶體中掃描,發現具有相同內容的物理頁面
    -- 執行去重
    -- 作業系統發起,對使用者態透明

4.記憶體壓縮

  • 基本思想
    -- 當記憶體資源不充足的時候, 選擇將一些“最近不太會使用”的記憶體頁進行資料壓縮,從而釋放出空閒記憶體

a

大頁的利弊

  • 好處
    -- 減少TLB快取項的使用,提高 TLB 命中率
    -- 減少頁表的級數,提升遍歷頁表的效率
  • 案例
    -- 提供API允許應用程式進行顯示的大頁分配
    -- 透明大頁(Transparent Huge Pages) 機制
  • 弊端
    -- 未使用整個大頁而造成實體記憶體資源浪費
    -- 增加管理記憶體的複雜度

相關文章