CTF-虚拟机——【前置知识三】

文章目录

  • 内存虚拟化
  • 常见缩写
  • 虚拟机内存访问原理
  • 影子页表
  • 扩展页表
  • VPID(Virtual Processor Identifier):TLB(Translation Lookaside Buffer)资源优化

内存虚拟化

  • 能够提供在Guest机制中识别为从零开始的连续的物理地址空间
  • 各个VM之间进行有效隔离,调度,共享内存资源

常见缩写

HPA:Host Physical Address

HVA:Host Virtual Address

GPA:Guest Physical Address

GVA:Guest Virtual Address

PDBR:页目录表物理基地址寄存器,X86上叫CR3(Page Directory Base Register)

EPT:扩展页表(Extend Page Table)

SPT:影子页表 (shadow page table)

ptr:这里用来描述指向某个页表的寄存器

虚拟机内存访问原理

当Guest 访问自身内存时,步骤如下

1.通过Guest 页表将GVA转换位GPA
2.GPA在对应的式Host中一大块mmap的内存上的,所以要将GPA再转换为HVA
3.最后通过Host上的页表将HVA转化为HPA

缺点:流程繁重,从而使得虚拟机中的内存访问性能极其低下

影子页表

影子页表: GVA→HPA 映射关系的页表
实现机制:
内存访问时,需要使用到读写CR3(存放页目录表物理基地址的寄存器)的操作指令,而该操作为敏感指令,所以VMM会截获这个操作,并将页表替换为影子页表,这样页表便被替换为 GVA→HPA 映射关系的页表。

缺点:每套页表都要独立维护一份影子页表,且需要多次在VMM与VM进行切换,开销不小

扩展页表

EPT:GPA→HPA 映射关系的页表
硬件层面引入EPTP寄存器,来指向EPT页表基地址。Guest运行时,Guest页表被载入PDBR,而 EPT 页表被载入专门的EPT 页表指针寄存器 EPTP。

实现机制:
GVA->GPA的转换依然是通过查找原来页表完成,而GPA->HPA的转换则通过查找EPT来实现,每个guest VM有一个由VMM维护的EPT。同时 Hypervisor 仅需要截获 EPT Violation 异常(EPT 表项为空)

VPID(Virtual Processor Identifier):TLB(Translation Lookaside Buffer)资源优化

TLB为页表项缓存,缓存了最近的虚拟地址转换记录。当进行地址转换时 CPU 首先会先查询 TLB,TLB 根据虚拟地址查找是否存在对应的 cache,若 cache 没有才会查询页表。

由于 TLB 是与对应的页表进行工作的,因此在切换页表时 TLB 原有的内容就失效了,此时我们应当使用 INVLPG 使 TLB 失效,如在 VM-Entry 与 VM-Exit 时 页表会切换,CPU 都会强制让 TLB 失效,但这么做仍存在一定的性能损耗。

VPID是对TLB资源管理的优化,它为每个TLB表项标记一个VPID标识(VMM 为每个 vCPU 分配一个唯一的 VPID,存放在 VMCS 中,逻辑 CPU 的 VPID 为 0),在 CPU 查找 TLB 缓存时会先比对 VPID,这样我们就无需在每次进行 VM entry/exit 时刷掉所有的缓存,而可以继续复用之前保留的 cache。
CTF-虚拟机——【前置知识三】_第1张图片

你可能感兴趣的:(CTF-PWN-虚拟机,java,linux,开发语言)