AMD SEV基本原理

AMD SEV基本原理

  • 背景
  • SME
    • Arch
    • C-bit
    • SME-MK
    • Interface
      • SME
      • SME-MK
  • SEV
    • Arch
    • Interface
  • SEV API
    • Key Management
    • Guest Policy
    • Mailbox Register Protocol
    • Platform Management API
    • Guest Management API

背景

  • TODO

SME

  • SME(Secure Memory Encryption)是AMD内存加密硬件特性,AMD通过在SOC的内存控制器上增加加解密引擎,实现对内存数据的加解密。

Arch

  • SME内存加密原理如下图所示:
    在这里插入图片描述
  • TODO

C-bit

  • 为支持对内存的加密并且兼容原有的MMU硬件设计,AMD将页表项中原来存放物理页地址的字段划分出1个bit作为C-bit(enCrypted bit),用于控制该表项指向的物理内存页是否需要加密。由于页表项的低12bit已经被用做传统的页表转换功能,因此C-bit只能放到存放物理页地址的字段,并且其具体位置和硬件架构相关,需要通过CPUID获取得到。注意,C-bit可以存在于PTE、PDE、PDPE甚至PML4E的表项中,因此C-bit既可以控制1个具体的物理页是否加密,可以控制整个PDE、PDPE、PML4E表包含的物理页是否加密。
  • 下图是AMD手册中1个4K页表项的字段描述,对于Hygon C86 7380 32-core Processor,其C-bit为bit 47。从硬件设计来看,AMD牺牲了至少1 bit物理地址位宽来支持内存页加密。
    在这里插入图片描述
  • AMD利用页表项中的物理地址来支持内存加密,势必会导致物理地址位宽减少,AMD没有给出计算减少物理地址位宽的方式,而是提供了CPUID指令让用户查询, AMD手册中查询C-bitPhysAddrReduction介绍如下图所示(Volume 3 Appendix E.4.17):
    在这里插入图片描述
  • 当EAX输入为0x8000001F,执行CPUID指令后,EBX寄存器中存放了CbitPositionPhysAddrReduction相关信息:
  1. CbitPosition: C-bit在页表项中的位置,单位bit
  2. PhysAddrReduction:引入C-bit后页表项中物理地址减少的宽度,单位bit
  • C-bit既能在CPU的非虚拟化(non-vitualized)模式打开,也可以在虚拟化模式且SEV特性使能的时候打开。在虚拟化模式下,使用NPT实现硬件辅助的内存虚拟化时,AMD CPU支持通过在Guest的页表项中设置C-bit来控制是否对GPA对应的物理页是否加密。Guest页表项的C-bit控制物理页是否加密原理示意图如下所示:
    在这里插入图片描述
  • AMD NPT在检测到C-bit使能后,会在页地址转换时增加额外逻辑处理C-bit,具体为:
  1. 提取NPT的输入 — Guest页表项内容(GPA),根据CPUID查询得到的CbitPosition信息在页表项中定位C-bit的位置,提取其内容并保存。
  2. 将GPA作为硬件NPT页地址转换的输入,得到HPA
  3. 将C-bit内容和2中得到的HPA一道,作为页表项内容填入物理内存页表
  • 注意,通过CPUID查询得到的PhysAddrReduction,只对物理地址的宽度有影响,对Guest的GPA地址没有影响。假设查询得到PhysAddrReduction为5,那么原来52bit的物理地址HPA变为了52-5=47bit。对于GPA,其宽度只减少了1bit,即C-bit占用的那1bit。

SME-MK

  • C-bit的引入为系统软件提供了1个内存页加密的开关。在非虚拟化的应用场景下,为了让OS软件实现更细粒度的加密控制,AMD还设计了Multi-Key Secure Memory Encryption (SME-MK)特性,该特性允许OS软件将加密内存使用的密钥导入到SOC的内存控制器中,然后在内存加密时通过选择密钥ID(EncrKeyID)指定使用的密钥。SME-MK可以通过CPUID Fn8000_0023_EAX[MemHmk]来查询CPU是否支持,可以通过CPUID Fn8000_0023_EBX[MaxMemHmkEncrKeyID]查询EncrKeyID的最大值。
  • SME-MK特性可以支持OS上不同应用程序独立加密自己的内存,其设计并非支持机密虚拟化,因此SME-MKSME是互斥的。使能SME-MKSME需要关闭,下文介绍SEV时我们可以知道,SEV特性依赖SME的打开。因此可以理解为,SME-MK可以实现多个应用内存的独立加密,应用于非虚拟化场景,SME可以使多个虚机的内存独立加密,应用在虚拟化场景,即SEV场景。

Interface

SME

  • 软件可以通过CPUID探测CPU是否支持SME相关特性,同时通过写SYSCFG MSR(地址:0xc0010010)设置。
  • 通过CPUID Fn8000_001F[EAX],可以查询CPU是否支持SME,查询信息字段解释如下 :
    在这里插入图片描述
  • 通过写SYSCFG MSR可以使能SME,SYSCFG MSR字段解释如下:
    在这里插入图片描述
  • CPUID Fn8000_001F指令的EAX和EBX输出解释已在之前 介绍,这里贴出AMD手册中ECX和EDX中各字段含义,如下 :
    在这里插入图片描述
  • 以Hygon C86 7380 32-core Processor为例,并升级到Hygon支持机密计算的内核,通过cpuid工具查看CPU是否支持SME和SEV相关特性。
    在这里插入图片描述
  1. EAX:0xf,0b1111,支持SME、SEV、PageFlushMsr、SEV-ES
  2. EBX: 0x16f,0b101101111,
    bit[0]-bit[5]为CbitPosition,二进制0b101111,十进制47,表示C-bit控制位 在页表项的bit 47
    bit[6]-bit[11]为PhysAddrReduction,二进制0b101,十进制5,表示CPU寻址物理内存空间使用的地址长度减少了5bit
  3. ECX:0xffff,15,SEV相关,参考SEV章节
  4. EDX:0x1,MinSevNoEsAsid,SEV相关,参考SEV章节
  • 通过rdmsr工具查看当前CPU的SYSCFG MSR输出:0xf40000 = 0b1111 0100 0000 0000 0000 0000
    在这里插入图片描述
  • 参考手册,解析上面MSR寄存器的输出字段含义如下:
  1. bit 18: MFDE enabled
  2. bit 20: MVDM enabled
  3. bit 21: TOM2 enabled
  4. bit 22: FWB enabled
  5. bit 23: MEME,MemEncryptionModeEn enabled,内存加密特性使能
  6. bit 26: HMKE,HostMultiKeyMemEncrModeEn disabled

SME-MK

  • 通过CPUID Fn8000_0023_EAX[MemHmk]指令可以查询CPU是否支持SME-MK,如果CPU支持 ,可以通过CPUID Fn8000_0023_EBX[MaxMemHmkEncrKeyID]查询CPU支持的密钥数上限;通过写SYSCFG MSR可以使能SME-MK。CPUID的输出信息如下图所示,使能SME-MKSYSCFG MSR位在上一节已介绍。
    在这里插入图片描述
  • 通过cpuid工具查看SME-MK的支持情况:
    在这里插入图片描述
  • 可以看到输出EAX为0,Hygon C86 7380不支持SME-MK

SEV

  • SEV:(Secure Encrypted Virtualization)是AMD设计的机密虚拟化硬件解决方案。SEV在内存加密的基础之上,引入了安全处理器解决密钥管理的扩展性问题,支持为每个内存加密的虚机关联一个密钥。
  • 相比标准的X86虚拟化硬件方案,SEV最大的不同就是可以让Guest对其本身使用的主机上物理内存进行权限控制,Guest可以决定哪些内存可以暴露给hypervisor,哪些不可以暴露给hypervisor。更进一步,作为SEV的增强,SEV-ES特性还可以让Guest决定哪些寄存器可以暴露给hypervisor,哪些不可以暴露。

Arch

  • SEV整体架构示意图如下:
    在这里插入图片描述
  • 传统的虚拟化架构中有两个角色,分别是Hypervisor和Guest,Hypervisor负责了所有Guest的权限管理,可以对虚机的代码和数据进行查看和修改。具体表现为:
  1. Hypervisor可以访问虚机GPA对应的HPA内存内容。
  2. Hypervisor可以访问虚机使用的CPU寄存器内容。
  3. Hypervisor可以篡改虚机使用的镜像文件。
  4. Hypervisor可以根据需要修改启动虚机所使用的命令行参数。
  • SEV架构下新增了一个角色Guest Owner,将Hypervisor权限中的上述部分剥离出来,赋给了新角色Guest Owner。Hypervisor的CPU计算能力仍然被使用,但管理属性被削弱。SEV架构下,可以将Hypervisor的看成是提供计算虚拟化能力的虚机管理代理角色。
  • 在SEV架构下,每个机密虚机都关联了一个密钥,密钥管理由AMD Secure Processor负责;CPU与AMD Secure Processor之间基于厂商提供的SEV API实现SEV Driver,Hypervisor集成SEV Dirver后,进一步通过调用SEV API实现对机密虚拟机的生命周期管理。
  • AMD硬件逻辑中为每个机密虚机都关联一个密钥,作为加密该虚机内存的密钥,这是AMD Secure Processor的内部逻辑,那么Hypervisor软件如何指定虚机关联的密钥呢?AMD将VMCB结构中的ASID字段作为了机密虚机关联的密钥ID,当执行VMRUN指令运行虚机时,硬件读取VMCB结构中的ASID字段的值,作为密钥ID。当然,AMD能够支持的密钥个数有上限,上限值可以通过CPUID 8000_001F[ECX]查询得到,ASID作为密钥ID,其值也不能大于该上限。同时ASID在SEV使能,SEV-ES未使能的模式下,其取值还有1个下限,下限值通过CPUID 8000_001F[EDX]查询得到。

Interface

  • 在介绍SME的章节中,我们知道可以通过CPUID Fn8000_001F查询硬件对SME、SEV的支持情况,SEV相关字段总结如下:
  1. CPUID 8000_001F_EAX[SME]: 是否支持内存加密
  2. CPUID 8000_001F_EAX[SEV]: 是否支持机密虚拟化
  3. CPUID 8000_001F_EAX[SEV-ES]: 是否支持机密虚拟化且支持集存器的加密
  4. CPUID 8000_001F_EBX[CbitPosition]: C-bit在页表项中的位置
  5. CPUID 8000_001F_EBX[PhysAddrReduction]: 内存加密牺牲的物理地址位宽
  6. CPUID 8000_001F_ECX[NumEncryptedGuests]: 支持的最大机密虚机个数
  7. CPUID 8000_001F_EDX[MinSevNoEsAsid]: 使能SEV禁用SEV-ES的模式下,ASID的最小值
  • 我们再分析一下SME章节中CPUID指令查询得到的输出信息,现在我们知道了NumEncryptedGuestsMinSevNoEsAsid字段的含义,它确定了使能SEV禁用SEV-ES的模式下,ASID的取值范围是[1, 15]。
    在这里插入图片描述

SEV API

  • 从上述关于SEV的介绍中,我们知道AMD Secure Processor的主要功能是实现密钥管理,这是硬件的逻辑,当硬件具备这样的能力后,它通过MMIO Registers向SEV Driver提供与AMD Secure Processor通信的方式,SEV Driver再基于MMIO Registers实现平台管理API(Platform Management API)和虚机管理API(Guest Management API),供Hypervisor调用,整个架构示意图如下:
    在这里插入图片描述
  • AMD在提供SEV硬件机制的同时,也提供SEV API规范,开发者只要按照该规范实现SEV Driver并集成到Hypervisor,就可以支持SEV特性。因此SEV API才是指导开发者如何实现SEV虚拟化解决方案的标准参考文档,本章节简要介绍该规范涉及的内容。

Key Management

  • TODO

Guest Policy

  • TODO

Mailbox Register Protocol

  • TODO

Platform Management API

  • TODO

Guest Management API

  • TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/338721.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spark与Kafka的集成与流数据处理

Apache Spark和Apache Kafka是大数据领域中非常流行的工具,用于数据处理和流数据处理。本文将深入探讨如何在Spark中集成Kafka,并演示如何进行流数据处理。将提供丰富的示例代码,以帮助大家更好地理解这一集成过程。 Spark与Kafka的基本概念…

GC6109——双通道5V低电压步进电机驱动芯片,低噪声、低振动,应用摄像机,机器人等产品中

GC6109是双通道5V低电压步进电机驱动器,具有低噪声、低振动的特点,特别适用于相机的变焦和对焦系统,万向节和其他精密、低噪声的STM控制系统。该芯片为每个通道集成了256微步驱动器。带SPl接口,用户可以方便地调整驱动器的参数。内…

详细讲解MybatisPlus实现逻辑删除

目录 前言1. 基本知识2. 实战Demo3. 拓展 前言 对于MybatisPlus的相关知识可在我的博客进行搜索 对应的CRUD相关知识也可看我这篇文章:【Java项目】实战CRUD的功能整理(持续更新) 在讲述逻辑删除这个概念时,先引入另外一个概念&…

FineBI实战项目一(14):订单销售总额/总数分析开发

点击添加组件按钮,打开组件页面。 设置组件的属性,比如图标样式,指针值,目标值、颜色、大小、标签等。 点击下方切换到仪表盘。 点击仪表板中的左上方组件,添加组件到仪表盘。 编辑标题 第一个组件成功添加到仪表板。

高级分布式系统-第3讲 网络与网络互联

万维网的诞生 1957年10月4日, 苏联发射了人类第一颗人造卫星—斯普特尼克一号 美国政府震惊不已。 他们认为, 在日趋激烈的冷战对抗中, 自己已经全面落后于苏联。 为了扭转这一局面, 美国国防部很快于1958 年 2 月组建了一个神秘…

Magics 教程

文章目录 基本流程基本操作页面的介绍基本操作 基本流程 基本操作 页面的介绍 右侧是工具页,可以直接进行调整,也可以在选项&帮助->自定义用户界面 那里进行相关的调整 基本操作 直接拖动鼠标左键:选中物体鼠标右键: 长按…

解决JuPyter500:Internal Server Error问题

目录 一、问题描述 二、问题原因 三、解决方法 四、参考文章 一、问题描述 在启动Anaconda Prompt后,通过cd到项目文件夹启动Jupyter NoteBook点击.ipynb文件发生500报错。 二、问题原因 base环境下输入指令: jupyter --version 发现jupyter环境…

【数据库系统概论】期末复习2

系列文章 期末复习1 系列文章定义并理解下列术语,说明它们之间的联系与区别试述关系模型的完整性规则。在参照完整性中,什么情况下外码属性的值可以为空值?关系代数 定义并理解下列术语,说明它们之间的联系与区别 (1…

设计模式篇章(3)——七种结构型模式

结构型设计模式主要思考的是如何将对象进行合理的布局来组成一个更大的功能体或者结构体,这个现在讲有点抽象,用大白话讲就是利用现有的对象进行组合或者配合,使得组合后的这个系统更加好。好是相对于不使用设计模式,按照自己的堆…

安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm

需要准备一个u盘,需要格式化,且内存不小于8g 1 下载ubuntu镜像 下载链接: https://cn.ubuntu.com/download/desktop 2下载rufus Rufus - 轻松创建 USB 启动盘Rufus: Create bootable USB drives the easy wayhttps://rufus.ie/zh/ 准备好这…

章鱼网络 2023 年全回顾|暨12月进展报告

2023年,章鱼网络轻装上阵,身处加密行业的低谷中砥砺前行。 12月17日,经过整整1年时间的开发和打磨,章鱼网络在重磅上线 Octopus 2.0,即 $NEAR Restaking 和 NEAR-IBC,获得了社区和市场的一致认可&#xff…

【论文综述】一篇关于GAN在计算机视觉邻域的综述

前言 这是一篇关于GAN在计算机视觉领域的综述。 正文 生成对抗网络是一种基于博弈论的生成模型,其中神经网络用于模拟数据分布。应用领域:语言生成、图像生成、图像到图像翻译、图像生成文本描述、视频生成。GAN模型能够复制数据分布并生成合成数据&a…