天天看點

Intel SGX入坑必讀——《Intel SGX Explained》(個人翻譯,持續更新中)

寫在最前

入坑Intel SGX之前先打好基礎。《Intel SGX Explained》就是入坑必讀之一,有助于了解Intel SGX的原理。這裡僅作個人翻譯,便于加深了解,也友善感興趣的小夥伴一起學習交流。

原文下載下傳位址:《Intel SGX Explained》原文

摘要

Intel SGX是Intel架構上的一組擴充,用于在可能出現惡意特權軟體(如核心或系統管理程式)的計算機上為安全敏感運算的執行提供機密性和完整性保障。

本文主要基于三個SGX專利、Intel開發者手冊(已取代舊版的手冊)、和Intel在ISCA 2015年釋出的指南和另外兩個SGX專利對Intel SGX進行介紹和分析。這些論文、參考文獻、手冊以及指南作為主要的資料來源,專利僅作為補充資訊使用。

本文不再重複另外兩篇已在本文初版之後發表論文的内容。

本文的主要貢獻在于,首先,總結了針對Intel架構和微指令架構上的細節,幫助讀者了解Intel SGX;其次,詳實地将SGX相關的公開資料進行整理;再次,提供了一些關于SGX未公開技術細節的合理推斷;最後,分析了SGX的安全屬性。

1 概述

安全遠端計算(如圖1所示)是一個如何在被不可信方擁有和維護的遠端計算機上運作應用程式時在一定程度上保證機密性和完整性的問題。在一般情況下,安全遠端計算是無解的。全同态加密可以為部分特定的計算提供解決方案,但從性能表現上看并不實用。

Intel SGX入坑必讀——《Intel SGX Explained》(個人翻譯,持續更新中)

Intel SGX是可信計算領域最新的研究成果,旨在利用可信硬體解決在遠端計算機上進行安全遠端計算的問題(如圖2所示)。可信硬體建立一個安全容器,使用遠端計算服務的使用者将所需的資料和計算操作上傳到這個安全容器中。可信硬體保護其中進行運算的資料的機密性和完整性。

Intel SGX入坑必讀——《Intel SGX Explained》(個人翻譯,持續更新中)

與其前身TPM和TXT類似,SGX依賴于軟體驗證。通過認證(如圖3所示)向使用者證明其正在與由可信硬體支撐的安全容器中運作的特定的應用程式進行通信。(用于認證的)證明是一個對安全容器内容簽發的密碼學簽名。遠端計算機的擁有者可以将任意應用程式加載到安全容器中,但是使用遠端計算服務的使用者将拒絕将她的資料載入一個哈希值與期待不符的安全容器中。

使用遠端計算服務的使用者使用可信硬體生産商建立的背書證書來驗證産生簽名的認證密鑰。證書規定認證密鑰隻對可信硬體可見且僅作認證使用。

SGX從衆多處理器産品中脫穎而出,其原因是,認證所覆寫的代碼處于在系統中受硬體保護的可信計算基(TCB)中。在最初TPM的設計中,認證覆寫所有運作在計算機上的代碼,而TXT的認證則覆寫所有VMX虛拟機。Intel SGX,一個enclave(安全容器)隻包含計算涉及的私有資料和操作計算的代碼。

例如,一個雲服務可以接受使用者上傳的經過加密處理的圖像并對其進行機密的醫學圖像處理。使用者可以将加密密鑰發送給在enclave内部運作的應用程式。enclave将包含解密圖像、圖像處理算法和加密圖像處理結果的代碼。這些代碼接收由使用者上傳的加密後的圖像,圖像的存放将在enclave外部進行。

一個啟動了SGX的處理器通過将enclave内部的代碼和資料與外部環境(包括作業系統、系統管理軟體以及其他連接配接到系統總線上的其他硬體裝置)隔離實作對enclave代碼和資料的完整性和機密性的保護。同時,SGX模型仍相容Intel體系架構中傳統的軟體分層,在這一體系架構中,作業系統核心和系統管理軟體管理計算機資源。

本文針對最原始版本的SGX,即SGX 1,展開讨論。盡管SGX 2為enclave開發者引入了許多有價值的改進,但從設計和實作角度來看,這些改進仍然是較小的增量式的改進。在充分了解SGX 1背後的原理和安全屬性後,讀者将可以根據Intel參考文檔輕松掌握SGX 2所帶來的一系列變化。

1.1 SGX Lighting Tour

(20210320更新)

SGX 留出了一部分稱為處理器保留記憶體(Processor Reserved Memory,PRM)的記憶體空間。CPU将阻止所有非enclave程式(包括核心、系統管理軟體、系統管理模式通路、直接記憶體通路)對PRM的記憶體通路。

PRM管理Enclave Page Cache(EPC)。EPC由衆多存儲了enclave代碼和資料的4KB頁組成。不可信的系統軟體負責将EPC配置設定給相應的Enclave。CPU跟蹤EPC頁的狀态并将這些狀态資訊記錄在Enclave Page Cache Metadata中,以保證每個EPC頁與相應的enclave保持正确的映射關系。

初始化代碼和資料将由不可信的系統軟體加載到Enclave中。在加載階段,系統軟體将詢問CPU并将資料從不受保護的記憶體(PRM之外的記憶體空間)拷貝到EPC頁中,并将頁對應配置設定給已經成功初始化的enclave。enclave的初始狀态對系統軟體來說是已知的。

所有enclave頁都加載到EPC後,系統軟體會通知CPU将這個enclave标記為“已初始化”。此時,應用程式将會在enclave中運作相應的代碼。在enclave初始化結束後,以上提及的加載方法将失效。

enclave加載時,CPU會計算這個enclave内容的密碼雜湊值。當enclave完成初始化時,這個hash操作也随之結束,最後形成的hash值将作為enclave的度量hash值。

遠端終端通過軟體認證(software attestation)確定自己正在和一個擁有特定度量hash值并運作在安全環境中的enclave進行通信。

執行流隻能通過特殊的CPU指令進入enclave中,這個轉換過程類似于從使用者模式切換到核心模式。enclave總是在保護模式下,即ring 3,,運作,并遵守OS核心和系統管理軟體設定的位址轉換規則。

為防止隐私資料洩露,運作在enclave模式下的CPU将不會直接響應中斷(interrupt)錯誤(fault)或者VM 退出操作。相反,CPU将會首先執行一個異步的enclave退出(AEX)操作,從enclave模式切換到ring 3模式,再響應中斷、錯誤或VM退出。AEX的實作原理是,CPU将其狀态儲存在一個事先定義好的enclave區域中,并将控制權傳遞給一個已經預先聲明好的enclave外部指令,随後用一堆無序數填充CPU寄存器。

給enclave配置設定EPC頁的工作由OS核心(或管理程式)完成。OS通過特殊的ring 0CPU指令将配置設定決定告訴SGX實作(?有點沒懂,這裡指的是SGX application還是SGX CPU?)。OS也可以通過特定的CPU指令将EPC頁驅逐到不受信任的DRAM中,并在之後再将這些頁加載進來。SGX利用密碼手段保證這些驅逐EPC頁在不可信記憶體空間中的機密性、完整性和新鮮性。

1.2 Outline and Troubling Findings

考慮到要深入了解Intel SGX技術安全屬性的原理需要大量背景知識,而這些背景知識的來源異常分散,是以本文很重要的一部分工作是對預備知識進行概括。

第2章概述了Intel架構的一些相關知識以及一些Intel處理器最新的一些微指令架構屬性。第3章簡述支援可信硬體系統的安全元件,包括密碼學工具和相關的攻擊。最後,第四章簡要介紹建立SGX所依賴的上下文結構的可信硬體系統。

在對背景知識有一個粗略的認知後,第5章将提供一些SGX開發的細節,這些内容主要來源于開發者手冊。

第6章分析了其他的公開資訊,例如一些SGX相關的專利,以填補SGX介紹文檔中缺失的細節。本章着眼于調研SGX安全屬性的細節,這些資訊會在本文剩餘部分涉及到。這部分調研概述了一些SGX安全保障書中令人困擾的内容缺失,以及隻能從其他Intel的資訊中得出結論的方面。

整個安全分析中最令人頭疼的部分也許正是Intel為SGX增加的啟動控制,強制所有計算機擁有者必須獲得第三方同意方能運作enclave。5.9節說明了在僅有的公開文獻中,啟動控制是一種許可機制,要求軟體開發者必須與Intel達成商業協定才能在開發程式時使用SGX提供的保護措施。所有官方文檔都謹慎地避開了這個問題,隻在Intel SGX的一些專利中有所稍稍提及。這些專利透露了這種許可計劃的存在。

這種許可機制問題目前也許無關痛癢,因為我們的安全分析顯示,考慮到SGX保障存在的各種限制,對安全持謹慎态度的程式開發者壓根兒就不會在安全遠端計算中毫無顧忌地依賴SGX。同時,如果SGX能夠開發出更好的安全特性,上述許可證方案将會變成一個大問題,畢竟Intel在桌面和伺服器處理器市場中占有幾乎壟斷的市場佔有率。具體來說,這種許可證限制将賦予Intel極大的權利決定未來依賴雲計算的産業的成敗。

2 計算機架構背景知識

本章主要籠統地介紹Intel運用最廣的處理器的架構原則以及這些處理器上運作的系統安全屬性背後的原理。如非特别說明,這部分資訊都是從軟體開發手冊中總結而來。

分析一個軟甲系統的安全性必須了解軟體執行環境所有組成部分之間是如何互動協同的。是以本章會特别長。我們盡量避免面面俱到地介紹安全内容,是以有x86架構背景的讀者可以直接跳過本章,在必要時再倒回來檢視。

我們用Intel processor或者Intel CPU來分别指代Intel Core系列的伺服器或桌面版本的處理器産品。考慮到空間限制和閱讀觀感,我們忽略其他Intel處理器産品,比如嵌入式系列産品或者已經廢止的安騰系列産品。相應地,Intel computer和Intel system分别指代圍繞Intel core處理器建立的計算機系統。

本文中Intel architecture指代Intel SDM中描述的x86架構。為了支援從1990年遺留下來的衆多直接在CPU上運作的軟體,x86架構異常複雜。限于篇幅和觀感,本文隻涉及現代64位軟體可見的架構。

本章所介紹的64位版本的x86架構實際上是由AMD發明的,是以也被記作是AMD64、x86_64或者x64。Intel架構已經明确我們主要關注Intel晶片上的架構實作并希望可以了解Intel SGX設計者的思路。

2.1 Overview

一台計算機的主要資源包括記憶體和處理器。在Intel計算機中,DRAM晶片提供記憶體,一個或多個CPU晶片組成邏輯處理器。這些資源将由系統軟體進行管理。一台Intel 計算機常運作兩種系統軟體,一種是作業系統,一種是系統管理程式。

Intel架構為支援多程式執行個體運作設計,這些程式執行個體成為程序。作業系統将計算機資源配置設定給所有運作中的程序。伺服器計算機,尤其處于雲計算環境中的伺服器計算機,可能同時運作多個作業系統執行個體。這是通過系統管理軟體為每個運作的執行個體配置設定相應的計算機資源份額實作的。

系統軟體使用虛拟化技術将其管理的每個程式分片與其他運作中的軟體隔離開來。這種隔離機制是将軟體複雜度管理在可控範圍内的關鍵。同時,應用程式和作業系統開發者僅關注他們的軟體,忽略和其他軟體的互動。

虛拟化技術的核心是位址轉換,讓軟體有獨占計算機記憶體的感覺。位址轉換提供的隔離機制可以有效防止惡意軟體對其他軟體造成危害,如篡改記憶體内容等。

虛拟化技術的另一個關鍵技術是通過CPU實施的軟體特權分級。硬體層面的特權分離保證了任意軟體無法通過幹擾系統軟體來間接破壞其他軟體。

程序通過建立操作線程來表達對計算資源的需求,這些需求由作業系統配置設定給邏輯處理器。一個線程包含了執行上下文,這是執行運算必須的資訊。例如,執行上下文結構儲存了處理器處理的下一條指令的位址。

作業系統給每個程序一種計算資源無限的感覺,并根據程序建立的線程數量成倍地提供可用的邏輯處理器。現代作業系統實作搶占式多線程機制,邏輯處理器可以在極短的時間内在多個線程之間切換。配置設定給邏輯處理器的線程變化通過執行上下文切換實作。

系統管理軟體為每個作業系統展示定量的虛拟處理器,并且使用上下文切換的方式實作為虛拟處理器上運作的多個客戶機提供相應的邏輯處理器。

邏輯處理器中的執行核心處理指令和資料的速度将遠遠高于DRAM。現代計算機中許多複雜設計都是為了彌補這個速度差異。最近的Intel CPU依賴于超線程、無序執行和緩存機制來解決這個問題,但同時對安全帶來了一些影響。

Intel處理器包含多級記憶體,這些記憶體的存取速度快于DRAM,但存儲量級遠小于後者。最快的中間存儲器是邏輯處理器的寄存器檔案。其他中間存儲器稱為緩存,Intel架構要求應用軟體顯式地管理好作為高速暫存空間的寄存器檔案。同時,緩存将靜默地加速DRAM請求速度,這些過程通常對于應用軟體來說是不可見的。

Intel計算機擁有多個邏輯處理器,也是以擁有分散在CPU晶片上的多個緩存。在多包系統中,緩存将會分散在多個CPU晶片上。是以,Intel系統使用緩存一緻性機制保證所有的緩存對DRAM保持同一視圖。得益于緩存一緻性機制,開發者在開發軟體時不會意識到緩存的存在,而程式可以在分布式緩存設計下正确運作。但是,緩存一緻并不會覆寫到位址轉換使用的專用緩存,系統軟體必須采取其他措施保證這些緩存的一緻性。

處理器之間的通信通過外界的輸入輸出裝置來完成,如網絡接口卡和顯示擴充卡等。在概念上,CPU和DRAM晶片、輸入輸出裝置通過系統總線進行通信。

根據Intel架構開發的應用軟體與輸入輸出裝置通過I/O位址空間和記憶體位址空間進行通信,其中,記憶體位址空間最初用于通路DRAM。系統軟體必須對CPU緩存進行配置,使得CPU緩存可以識别用于通路I/O裝置的位址空間。裝置通過中斷通知CPU發生了某事件,這個操作将導緻邏輯處理器停止處理目前線程,并喚醒一個特殊系統軟體的處理句柄。

由于要支援不同的外設以及大量架構各異的作業系統,Intel系統初始化流程異常複雜。初始化流程對于Intel計算機的安全加強來說是個巨大的挑戰,埋下了許多安全隐患。

Intel工程師們使用處理器微指令裝置對Intel架構進行了更為複雜的實作。微指令對于軟體開發者而言是完全不可見的,設計細節基本不公開。然而,為了評估這以結構上改進的可行性,我們必須要能夠區分使用微指令實作和純硬體實作方式之間的差別。

2.2 Computational Model

如圖所示,本章拼湊除了一個高度簡化的Intel架構的計算機模型。這個簡化模型旨在幫助讀者了解本文其他部分所使用的到的基本概念。下一章會逐漸将簡化模型細化為對Intel架構的較長的描述。

在這裡展示的所有模型組成部分都來源于文獻[165],這篇文檔對計算機系統進行了概述,并重點關注用于開發軟體系統的關鍵技術。

記憶體是一存儲單元集合,位址是從0開始的自然數,實作概述如圖所示。記憶體的一個特性是,通過位址讀取的某個記憶體單元結果必須與最近寫入這個記憶體單元的内容一緻。

邏輯處理器從計算機記憶體中反複讀取指令并執行,具體流程如圖所示。

處理器内置了記憶體,稱為寄存器檔案。這個寄存器檔案由驚天随機通路記憶體(Static Random Access Memory)單元組成,通常記作寄存器。寄存器的速度明顯快于DRAM,但也比後者貴得多。

一條指令根據輸入計算并将結果存儲到輸出位置。處理器寄存器為大部分的指令的輸入輸出準備執行上下文。比如ADD、RDX、RAX、RBX用于運作整數加法運算,輸入放在RAX和RBX中,結果存儲放在輸出寄存器RDX中。

這裡(圖6)提到的寄存器是指令指針(RIP),它儲存了下一條處理器執行的指令的位址,堆指針(RSP)則存放的是用于支援寄存器外設運作的call堆結構最頂端元素的記憶體位址。其他執行上下文寄存器将會在2.4和2.6節中進行介紹。

一般情況下,處理器反複從RIP中存儲的内位址中讀取指令并執行,随後将RIP更新為下一條指令的位址。與RISC結構不同,Intel架構使用大小可變的指令編碼方法,是以記憶體知道讀入指令時才知道這條指令的實際長度。

在執行一條指令時,如果未滿足指令執行的前提條件,處理器将發生錯誤。錯誤發生時,指令的執行結果将會被認為是錯誤的而不會被存儲到輸出位置中。例如,執行整數除法時如果被除數為0,則引發除法錯誤。

當指令結果出現錯誤,處理器将停止目前執行流,并将錯誤句柄記錄在2.8.2中。簡而言之,處理器首先會基于錯誤原因查找處理這個錯誤的代碼,并将處理環境設定為處理錯誤的句柄。

處理器和記憶體以及處理器之間通過系統總線連接配接。系統總線是一個廣播網絡結構(如圖7所示)。

每個時鐘周期中至多隻有一個裝置連接配接到位址總線并向所有連接配接在總線上的裝置發送消息。每個連接配接到系統總線上的裝置會将操作碼和發送消息的位址進行解碼,并忽略不需要它參與的消息。

例如,當一個處理器想要讀取記憶體位置的時候,它将會發送特殊的操作碼和想要通路的記憶體位置對應的總線位址。記憶體在總線中看到這條消息後将會執行一個讀指令。随後,記憶體會向相同的位址響應一條标記了READ-RESPONSE操作碼的消息,并将資料設為讀操作的結果。

計算機與外界通過I/O裝置進行通信,比如鍵盤、顯示器、網卡等。這些都将連接配接到系統總線上。裝置主要響應來自處理器的請求,同時也具有向處理器發起中斷請求來通知外部世界發生事件的能力。比如使用者敲擊鍵盤将引發中斷。

中斷的引發将在2.12節詳細讨論。在現代計算機系統中,裝置通過向一個特殊的總線位址發送消息來引發中斷。中斷被視作與錯誤類似的硬體異常并以相似的手段進行處理。

2.3 Software Privilege Levels

如圖8所示,在IaaS類型的雲環境中,如Amazon EC2,CPU叢集将軟體運作在四個不同的特權等級中。高特權等級的能力總大于第特權等級,是以高特權等級的軟體可以任意讀寫低特權等級的軟體。是以,軟體子產品将會被任一運作在高特權等級的軟體攻擊。軟體子產品預設無條件信任下層高特權等級軟體,而系統安全分析必須将運作在各個特權等級中的軟體的安全。

主機闆生産商使用系統管理模式(SMM模式)實作風扇管理、深度睡眠,或對缺失硬體進行模拟。因而電腦固件中的引導軟體負責設定DRAM中的一段連續的空間,以及将所有需要運作在SMM模式中的代碼加載到SMRAM中。SMRAM受到特殊的硬體保護,可以防止更低特權等級的軟體以SMM模式對其進行通路。

IaaS雲服務提供商允許使用者在虛拟化環境中運作他們自己的作業系統。Intel硬體虛拟化技術,或稱作虛拟機擴充(VMX)增加了對系統管理軟體的支援(或者如Intel文檔中稱為虛拟機監控)系統管理軟體運作在一個比作業系統更高的特權等級中(VMX root模式),負責跨作業系統配置設定硬體資源。系統管理軟體用CPU硬體虛拟化特性令每個作業系統相信自己獨占一台計算機(也就是一台虛拟機)。系統管理軟體代碼都運作在VMX root模式下的ring 0級别中。

運作在VMX root模式下并利用硬體虛拟化技術的系統管理軟體性能更佳,代碼庫也比基于二進制轉換的系統管理系統的更小。

系統研究文獻建議将作業系統分解為一個小核心,這個核心運作在更高的特權等級(稱作核心模式或管理者模式)中,在Intel架構中則是運作在ring 0層。核心配置設定計算機資源給各個系統元件,如各種裝置驅動和服務。這些系統元件将運作在更低的特權等級中。然而,考慮到性能(在不同ring層中運作一個程式會比調用處于同一特權等級的代碼慢),主流作業系統有大量運作在ring 0層的代碼。這個龐大的核心包括了裝置驅動、檔案系統代碼、網絡棧以及視訊渲染功能等。

應用程式代碼,如浏覽器或者遊戲用戶端,将會運作在最低特權等級中,也就是常說的使用者模式(對應Intel 架構中的ring 3層)。在IaaS雲環境中,由使用者提供的虛拟機鏡像将運作在非VMX root模式中,是以核心将運作在非VMX root模式的ring 0層,應用程式代碼運作在非VMX root 模式的ring 3層。

2.4 位址空間

遵循Intel架構規則的軟體使用四種不同的實體位址空間通路計算機資源。這些位址空間在内容和功能上會有部分重合,可能會引起誤解。本節從高度抽象的角度介紹Intel 架構中的實體位址空間,着重介紹它們各自的功能以及管理方法。

寄存器空間由通路CPU寄存器檔案的寄存器組成,是唯一以CPU時鐘頻率工作的記憶體,不會造成任何延遲。寄存器空間由CPU架構定義,并記錄在SDM文檔中。

一些寄存器,如控制寄存器,在配置CPU操作中起到特殊的作用。比如,CR3在位址轉換中扮演着核心角色。這些寄存器隻能由系統軟體通路。其他寄存器為應用程式的運作準備好上下文結構,這個上下文結構本質上是一個高速暫存空間。這些寄存器可以通路所有特權等級空間,具體的配置設定由軟體編譯器管理。許多CPU指令隻能操作寄存器中的資料,并且隻能将結果存儲在寄存器中。

記憶體空間,一般稱為位址空間或者實體位址空間,包含了64GB到1TB不等的位址。記憶體空間起初用于通路DRAM,但也用于記憶體映射的裝置之間的通信,裝置從系統總線中讀取記憶體通路請求并将給CPU的應答寫入記憶體。一些CPU指令将從記憶體空間中讀取它們的輸入,或者将結果存儲在記憶體空間中。

一個更為人熟知的記憶體映射的例子是,一台計算機啟動時,4GB标記之下的64KB記憶體位址将會被映射到一個閃存裝置中,用于支撐引導計算機第一階段的代碼。

在引導過程中,由計算機固件分割裝置與DRAM之間的記憶體空間。包括主機闆專用代碼在内的系統軟體有時候将修改記憶體空間劃分。如第2.5節所介紹的,OS核心依賴于位址轉換來控制應用程式對記憶體空間的通路。系統管理軟體也依賴相同的機制控制客戶作業系統。

I/O空間由2^16個被稱為接口的I/O位址組成。I/O接口專用于裝置通信。CPU為讀寫I/O位址提供特殊的指令。I/O接口遵循規範或實際應用标準進行配置設定。例如,接口0xCF8和0xCFC總是用于通路PCI express配置空間。

CPU為系統軟體提供了細粒度的I/O 通路權限機制。然而,現代核心直接進制應用程式通路I/O空間以防止應用軟體bug帶來的安全隐患。

模型專用寄存器(Model-Specific register,簡稱MSR)空間包含了2^32個用于執行CPU操作的MSR,使其語義成為Intel架構的一部分。例如,架構MSR 0x10支撐了一個高分辨率單調遞增的時間戳計數器。

CPU為讀寫MSR空間提供了指令。這些指令隻能由系統軟體使用。應用程式通過一些指令也可以通路到一些MSR。例如,應用程式可以通過RDTSC和RDTSCP指令讀時間戳計數器,這對度量和優化軟體大有裨益。

2.5 位址轉換

系統軟體依賴CPU位址轉換機制來實作對特權等級更低的軟體的隔離。幾乎所有的安全的體系結構設計都會修改位址轉換機制。在這裡我們總結Intel架構中與系統安全屬性建立相關的位址轉換特性,如果讀者有興趣可以自行閱讀[108]以擷取更多關于位址轉換的内容。

2.5.1 位址轉換概念

虛拟位址是程式用于加載和存儲指令的記憶體空間,實體位址則是真正的實體位址空間。從系統角度出發,位址轉換是實體位址與虛拟位址之間的一層。實體位址與虛拟位址之間的映射由頁表定義并由系統軟體管理。

作業系統利用位址轉換實作虛拟位址抽象,如圖11所示。虛拟記憶體抽象的接口與2.2節所述的記憶體抽象的接口一緻,但每個程序使用一個分離的虛拟位址空間通路到配置設定給它的記憶體。對于應用程式開發者而言,虛拟記憶體可以認為是假裝每個程序在獨立計算機上運作并擁有自己的DRAM的模型。

作業系統用位址轉換來實作DRAM的多程式複用,并将各自操作都隔離開來,防止應用程式直接通路記憶體映射的裝置。後兩個保護手段能夠防止某一個應用程式bug對其他應用程式以及系統核心本身造成影響。系統管理軟禁也運用位址轉換方式将DRAM分割給不同的作業系統,并将記憶體映射的裝置進行虛拟化。

位址轉換模式用在64位作業系統中,在Intel文檔中被稱為IA-32e,将48位虛拟位址映射為至多52位實體位址。如圖12所示,位址轉換過程由CPU中的專用硬體完成,這些硬體一般被稱為位址轉換單元或者記憶體管理單元(MMU)。

低12位虛拟位址在轉換過程中保持不變,高36位将被分為4個9比特長的索引,分别用于不同頁表中進一步索引。盡管叫做“表”,頁表的資料結構非常類似于一個完整的512叉搜尋樹,每個節點都有固定的鍵值。每個點都代表着DRAM中一組512個8位元組大小的入口,每個入口包含下一層孩子節點的實體位址以及一些标記值。根節點的實體位址存放在CR3寄存器中。最底層的節點集合包含位址轉換後的實體位址結果。

位址轉換函數并不改變位址的低位,隻是将記憶體位址空間分割到不同的頁中。一頁就是不受位址轉換影響的不同位址低位的集合,是以所有在同一個虛拟頁中所有虛拟位址都量被轉換為同一個實體頁。如此看來,位址轉換函數可以看做是虛拟頁标和實體頁标之間的映射(如圖13所示)。

除了隔離應用程式的程序,作業系統也會用位址轉換機制來運作整體記憶體消耗超過計算機DRAM大小的程式。OS時不時地會将使用過的記憶體頁從DRAM中驅逐到更大(但更慢)的存儲空間中,如硬碟或固态硬碟。曆史原因,我們說更慢的存儲空間統一指代硬碟。

OS被賦予過度送出DRAM,或常常被稱為頁面交換,的能力主要是出于以下幾點考慮。當應用程式程序向通路被驅逐的頁時,OS必須介入并将缺失的頁讀入DRAM。為了做到這一點,OS也許會将其他的頁驅逐出DRAM,和硬碟頁做交換。背後實作的細節将在後續章節中展開。

CPU位址轉換也是和頁相似的原理,即頁面交換。

2.5.2 位址轉換和虛拟化

利用硬體虛拟化技術的計算機使用系統管理軟體同時運作多個作業系統。這會帶來一些資源緊張,因為每個作業系統都認為自己被寫進一個專屬的計算機DRAM中。這種資源緊張将會在第二層位址轉換中得到緩解,如圖14所示。

當系統管理軟體保持活躍時,由作業系統設定的頁表将虛拟位址和實體客戶機實體位址映射到客戶機實體位址空間中。系統管理軟體通過第二層位址轉換結構複用不同作業系統上客戶機位址空間,在這裡将使用到擴充頁表(EPT)結構将客戶機實體位址映射到真正的實體位址上。

EPT使用與頁表相同的資料結構,是以轉換的操作過程也和IA-32e位址轉換是一樣的。主要的不同在于,資料結構根節點的實體位址将存儲在客戶作業系統上虛拟機控制結構(VMCS)中的EPTP域裡。圖15展示了硬體虛拟化中的位址轉換過程。

(施工中)

繼續閱讀