第九章 虛拟存儲器
虛拟存儲器是硬體異常,硬體位址翻譯,主存,磁盤檔案和核心軟體的完美互動
虛拟存儲器的三個重要能力:
- 将主存看成是一個存儲在磁盤上的位址空間的高速緩存,在主存中隻儲存活動區域,并根據需要在主存和磁盤間來回傳送資料
- 為每個程序提供了一緻的位址空間,進而簡化了存儲器管理
-
保護了每個程序的位址空間不被其他程序破壞
虛拟機存儲器是計算機系統重要概念之一:
- 虛拟機存儲器是中心的
- 虛拟機存儲器是強大的
- 虛拟機存儲器是危險的
第一節 實體和虛拟尋址
每個位元組都有唯一的實體位址
實體尋址:CPU通路存儲器最自然的方法就是使用實體位址

現代處理機用的是虛拟尋址的形式
第二節 位址空間
位址空間是非負整數的位址集合,如{0,1,2,3……}
若位址空間是連續的,則稱其為線性位址空間
現代系統典型地支援32位或者64位的虛拟位址空間
虛拟位址空間:該系統帶一個虛拟存儲器,CPU從一個有N=2^n個位址的位址空間中生成虛拟位址
實體位址空間:它與系統中實體存儲器的M個位元組相對應,如{0,1,2,…,M-1}
第三節 虛拟存儲器作為緩存的工具

在任意時刻,虛拟頁面的集合都分為三個不相交的子集:
- 未配置設定的:VM系統還未配置設定(或建立)的頁
- 緩存的:目前緩存在實體存儲存儲器中已配置設定頁
- 未緩存的:沒有緩存在實體存儲存儲器中已配置設定頁
資訊安全系統設計基礎第十三周學習總結
DRAM緩存的組織結構
SRAM緩存來表示位于CPU和主存之間的L1,L2和L3高速緩存,并用DRAM緩存來表示虛拟存儲器系統的緩存,它在主存中緩存虛拟頁
DRAM緩存的組織完全是由巨大的不命中開銷驅動的
由于大的不命中處罰DRAM緩存全是相連的
頁表
頁命中
缺頁
第四節 虛拟存儲器作為存儲器管理的工具
作業系統為每個程序提供了一個獨立的頁表
VM簡化了連結和加載,代碼和資料共享,以及應用程式的存儲器配置設定
- 簡化連結:獨立的位址空間允許每個程序的存儲器映像使用相同的基本格式,而不管代碼和資料實際存放在屋裡存儲器的何處
- 簡化加載:虛拟存儲器還使得容易向存儲器加載可執行檔案和共享對象檔案
- 簡化共享:獨立位址空間為作業系統提供了一個管理使用者程序和作業系統自身之間共享的一緻機制
- 簡化存儲器配置設定:虛拟機儲存為使用者程序提供了一個簡單的配置設定額外存儲器機制
第五節 虛拟存儲器作為存儲器保護機制
若一條指令違反了許可條件,那麼CPU就觸發一個一般保護故障,将控制傳遞給一個核心中處理的異常處理程式,Unix外殼一般将這種異常報告為“段錯誤”
PTE的三個許可位:
- SUP:表示程序是否必須運作在核心模式下才能通路該頁
- READ:讀權限
- WRITE:寫權限
第六節 位址翻譯
位址翻譯就是一個N元素的虛拟位址空間VAS中的元素和一個M元素的實體位址空間PAS中元素之間的映射
映射:
- 頁面基址寄存器PTBR指向目前頁表
- MMU利用VPN選擇适當的PTE
- PPO=VPO
資訊安全系統設計基礎第十三周學習總結
CPU硬體執行步驟:
當頁面命中時,CPU動作:
- 處理器生成虛拟位址,傳給MMU
- MMU生成PTE位址,并從高速緩存/主存請求得到他
- 高速緩存/主存向MMU傳回PTE
- MMU構造實體位址,并把它傳給高速緩存/主存
- 高速緩存/主存傳回所請求的資料給處理器。
資訊安全系統設計基礎第十三周學習總結
處理缺頁時:
- PTE中有效位為0,觸發缺頁異常
- 确定犧牲頁
- 調入新頁面,更新PTE
- 傳回原來的程序,再次執行導緻缺頁的指令,會命中
資訊安全系統設計基礎第十三周學習總結
結合高速緩存和虛拟存儲器
利用TLB加速位址翻譯
多級頁表
端對端的位址翻譯
第八節 存儲器映射
映射對象:
- Unix檔案系統中的普通檔案
- 匿名檔案(全都是二進制0)
再看共享對象
再看fork函數
再看execve函數
加載并運作a.out:
使用mmap函數的使用者級存儲器映射
參數含義:
- start:這個區域從start開始
- fd:檔案描述符
- length:連續的對象片大小
- offset:距檔案開始處的偏移量
-
prot:通路權限位
參數port:
- PROT_EXEC:這個區域内的頁面由可以被CPU執行的指令組成
- PROT_READ:這個區域内的頁面可讀
- PROT_WRITE:這個區域内的頁面可寫
- PROT_NONE:這個區域内的頁面不能被通路
第九節 動态存儲器配置設定
配置設定器的兩種風格:
- 顯示配置設定器-malloc和free
- 隐式配置設定器/垃圾收集器
malloc和free函數
malloc函數:
sbrk函數:
free函數:
配置設定器的要求和目标:
要求:
- 處理任意請求序列
- 立即響應請求
- 隻使用堆
- 對齊塊
-
不修改已配置設定的塊
目标:
- 最大化吞吐率(吞吐率:每個機關時間裡完成的請求數)
- 最大化存儲器使用率——峰值使用率最大化
資訊安全系統設計基礎第十三周學習總結
碎片
- 外部碎片
- 内部碎片
現實問題
- 空閑塊組織
- 放置
- 分割
- 合并
隐式空閑連結清單
将堆組織成一個連續的已配置設定塊和空閑塊的序列:
放置已配置設定的塊
放置政策:
- 首次适配:從頭開始搜尋空閑連結清單,選擇第一個合适的空閑塊
- 下一次适配:從上一次搜尋的結束位置開始搜尋
- 最佳适配:檢索每個空閑塊,選擇适合所需請求大小的最小空閑塊
擷取額外的堆儲存器
合并空閑塊
帶邊界标記的合并
第十節 垃圾收集
垃圾收集器是一種動态存儲配置設定器,它自動釋放程式不再需要的已配置設定塊,這些塊被稱為垃圾,自動回收堆存儲的過程叫做垃圾收集
垃圾收集器将存儲器視作一張有向可達圖,隻有當存在一條從任意根節點出發并到達p的有向路徑時,才說節點p是可達的,而不可達點就是垃圾
Mark&Sweep垃圾收集器
- ptr isPtr(ptr p):如果p指向一個已配置設定塊中的某個字,那麼就傳回一個指向這個塊的起始位置的指針b,否則傳回NULL
- int blockMarked(ptr b):如果已經标記了塊b,那麼就傳回true
- int blockAllocated(ptr b):如果塊b是已配置設定的,那麼久傳回ture
- void markBlock(ptr b):标記塊b
- int length(ptr b):傳回塊b的以字為機關的長度,不包括頭部
- void unmarkBlock(ptr b):将塊b的狀态由已标記的改為未标記的
- ptr nextBlock(ptr b):傳回堆中塊b的後繼
資訊安全系統設計基礎第十三周學習總結
C程式的保守Mark&Sweep
第十一節 C程式中常見的與存儲器有關的錯誤
間接引用壞指針
scanf錯誤
讀未初始化的存儲器
假設堆存儲器被初始化為0
允許棧緩沖區溢出
緩沖區溢出錯誤
假設指針和它們指向的對象是相同大小的
在遠處起作用action at distance