写在最前

入坑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是可信计算领域最新的研究成果,旨在利用可信硬件解决在远端计算机上进行安全远程计算的问题(如图2所示)。可信硬件建立一个安全容器,使用远程计算服务的用户将所需的数据和计算操作上传到这个安全容器中。可信硬件保护其中进行运算的数据的机密性和完整性。
与其前身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展示了硬件虚拟化中的地址转换过程。

若将present(P)这个标志位被设定为0, 表示未用的地址空间部分,也就是暂无与之相关联的物理内存。系统软件也会在页被驱逐出DRAM的时候将其P标志位设置为0。当地址转换单元遇到一个为0的P标志位时,会停止转换操作并提交一个硬件异常,如2.8.2所述。这个硬件异常使得系统软件有机会介入并从RAM中重新载入一个被驱逐的页。
支持软件隔离的主要attribute有:writable(W)标志位,将它置0可以达到禁止写任何页内的内存的效果;execution(XD)标志位,将它置1可以达到防止从本页取指令的效果;supervisor(S)标志位,将它置1可以达到禁止任何来自ring3级别的应用程序的访问。

2.6 运行上下文

64位Intel架构下的应用程序利用各种CPU寄存器实现与处理器的交互,如图16和表1所示。这些寄存器中的值组成了应用程序的线程状态,或称运行上下文(execution context)。
操作系统内核通过上下文切换(context switching)实现对多应用程序专属逻辑处理器的复用。也就是说,将所有构成线程运行上下文的寄存器的值进行保存,随后将其替换成之前保存过的其他线程的上下文。上下文替换也是用安全容器运行代码的重要组成环节,所以这一设计有着安全含义。
整数和内存地址都存储在16个通用寄存器(general-purpose registers)中。前8个GPRs的名字是从之前32位Intel架构中的寄存器名扩展而来:RAX、RBX、RCX、RDX、RSI、RDI、RSP和RBP。另8个寄存器简单记为R9-R16。RSP是用来存放指向程序调用栈顶的指针的寄存器。程序调用发生时,CPU指令会自动读取和修改RSP和其指向的栈。程序调用操作有CALL和RET,以及包括PUSH和POP在内的其他特定的栈操作指令。
所有应用层序也使用RIP寄存器,该寄存器存放当前执行语句的地址。应用程序还会使用RFLAGs寄存器,其比特位分别用于存储比较结果和控制各种指令。
软件可能使用其他寄存器与特定的处理器功能进行交互,如表1所示。
Intel架构为操作系统内核提供一种功能(此处原文可能有误,应为feature)证明方法,用以保存应用使用的特定功能寄存器内的值。XSAVE指令将request-feature bitmap(RFBM)作为输入,并将被调用的特定功能寄存器对应内存空间中的RFBM位置1。之后可以用XRSTOR指令将暂存在XSAVE写过的内存区域中的值加载回寄存器。这部分内存区域已包含输入到XSAVE的RFBM,所以XRSROR无需任何RFBM输入。
应用程序向内核声明它计划使用的功能,所以内核知道执行上下文切换时的XSAVE bitmap。当收到系统调用,内核会依照应用程序的声明将XCR0寄存器设为相应功能bitmap。如果程序想使用一个没有被XCR0启动的功能,则CPU产生一个默认设置,那么发生上下文切换的时候,应用将无法改变这些不在内核考虑范围内的特定功能寄存器的值。内核可以使用CPUID指令获知功能bitmap对应的XSAVE内存区域的大小,并计算出它需要给每个应用线程分配多大的内存空间。

2.7段寄存器


(施工中)

Intel SGX入坑必读——《Intel SGX Explained》(个人翻译,持续更新中)相关推荐

  1. [摘抄] 资深软件项目经理/产品经理“扯皮技巧”汇总(新手入坑必读,不定期更新)...

    左耳朵耗子 (陈皓):<开发团队的效率> http://coolshell.cn/articles/11656.html (介绍并点评了)以下几种典型的开发方式(以及他们在实践中难以避免的 ...

  2. 博士入坑必读-A-Z博士(PhD)顺利毕业必读指南

     本书主要讲解读博过程中一些关键要点.能力.核心要素,以及如何学会或达到这些能力.这本书主要面向理科和工科的博士生.特别是,本书讨论的主题是:定义读者的研究问题,发散文献综述,准备和执行实验,时间管理 ...

  3. 最好的Vue组件库之Vuetify的入坑指南(持续更新中)

    目录 安装Vuetify 文档结构 快速入门 特性 样式和动画 首先先声明,个人不是什么很牛逼的大佬,只是想向那些想入坑Vuetify的前端新手或者嫌文档太长不知如何入手的人提供一些浅显的建议而已,能 ...

  4. webpack1.x环境配置与打包基础【附带各种 “坑“ 与解决方案!持续更新中...】

    webpack1.x环境配置与打包基础[附带各种 "坑" 与解决方案!持续更新中...] 参考文章: (1)webpack1.x环境配置与打包基础[附带各种 "坑&quo ...

  5. fw150rm刷openwrt固件_交作业 - 入坑J1900 软路由(刷原版OpenWrt 更新单线多拨)

    本帖最后由 bryant2 于 2020-4-25 12:59 编辑 引言 前不久把家里电信光纤升级到了199的300M套餐(其实当时是为了无限流量卡,因为工作需要经常出差,有一个插SIM卡的随身华为 ...

  6. native react ssh_React Native踩坑笔记(持续更新中...)

    最近发现市场上对React Native开发人员的需求挺多的,自己就想学习一下React Native,多一门技术,好将来买个好价位.嘿嘿! 在学习React Native中碰到了不少坑,再次记录下来 ...

  7. Intel SGX 入坑(0x200f)

    看了那么多博客,可以用,但是大都卡在了最后一步:error:0x200f;只能自己解决问题,于是写了这篇博客,供大家一起学习 配置: 一. IDE:visual stdio 2017专业版(2015的 ...

  8. 熬夜慢性自杀全过程曝光 | 程序员入坑必读

    点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...

  9. 博士入坑必读教材-A-Z博士(PhD)顺利毕业必读指南

     本书主要讲解读博过程中一些关键要点.能力.核心要素,以及如何学会或达到这些能力.这本书主要面向理科和工科的博士生.特别是,本书讨论的主题是:定义读者的研究问题,发散文献综述,准备和执行实验,时间管理 ...

最新文章

  1. 复制介绍、复制的实用价值
  2. [BUUCTF-pwn]——ciscn_2019_n_3
  3. springboot三种过滤功能的使用与比较
  4. Unity3D For Android 开发教程【转http://game.ceeger.com/Unity/Doc/2011/Unity3D_For_Android.html】...
  5. 【Lucy-Richardson去卷积】迭代加速算法
  6. IDEA远程调试Tomcat
  7. ExtJs2.0学习系列(13)--Ext.TreePanel之第二式
  8. ubuntu14.04中离线安装docker
  9. php安装sg11扩展,Centos下安装SG11加密扩展插件
  10. java读取properties文件详解
  11. android ConstraintLayout布局 详解
  12. 老电脑xp系统最流畅的浏览器_1步打造极限精简的win10系统,让老电脑像新机般流畅,再也不卡了...
  13. 自动计数报警器c语言,计数报警器设计
  14. 个人征信系统机构接入工作流程
  15. fastjson解析json文本
  16. 算术左、右移位与逻辑左、右移位,右移一位和除二的区别、算术溢出
  17. XZ_iOS 之各大银行URL Schemes
  18. PDF拆分与合并工具(DOS版)
  19. 移动硬盘文件乱码是怎么回事?数据还能恢复吗
  20. 多传感器融合定位ch1

热门文章

  1. vue 引入json地图_vue中echarts引入中国地图的案例
  2. 达梦数据库 分区表实例
  3. 微信8.0或将开启新时代
  4. 【常用模块】ESP8266 WIFI串口通信模块使用详解(实例:附STM32详细代码)
  5. 【开源电路】STM32F401RCT6开发板
  6. Matlab进行彩色图像直方图匹配(不用histeq函数)
  7. TensorFlow 多层感知器
  8. 锐能微RN8302/RN8302B电表芯片应用
  9. 关于电影制作方和观众之间的思考
  10. 大泉州汽车网整站程序PHP生成html开源版 V1.1.4