这篇内容,通过从操作系统的虚拟地址介绍到虚拟机层面的内存虚拟化技术,并介绍这两种技术之间的关联。

(以下实例都以intel 64位处理器和win10 x64操作系统位例。 )

一、虚拟地址

在保护模式下,每个进程拥有自己独立的虚拟内存,程序的代码、全局数据、栈空间等使用自己独立的虚拟内存。每个进程可以访问自己独立的以0开始的虚拟地址(VA),即每个进程可以有跟其他进程相同的虚拟地址(VA)起始地址(start address)和结束地址(end address)。

虚拟内存被操作的时候,会分配一块实际的物理内存与它对应。

这篇内容,通过从操作系统的虚拟地址介绍到虚拟机层面的内存虚拟化技术,并介绍这两种技术之间的关联。

(以下实例都以intel 64位处理器和win10 x64操作系统位例。 )

一、虚拟地址

在保护模式下,每个进程拥有自己独立的虚拟内存,程序的代码、全局数据、栈空间等使用自己独立的虚拟内存。每个进程可以访问自己独立的以0开始的虚拟地址(VA),即每个进程可以有跟其他进程相同的虚拟地址(VA)起始地址(start address)和结束地址(end address)。

虚拟内存被操作的时候,会分配一块实际的物理内存与它对应。

CPU内部的MMU(内存管理单元)会把虚拟地址(virtual address)翻译为对应的物理地址(physical address),借助于CR3寄存器。CR3寄存器存储该进程的最顶级页目录。

每一个虚拟地址被分成几份,每一份作为一个索引,得到多个索引值和一个页偏移。从最顶级页目录找到索引所在的项。从项取出次顶级页目录的起始物理地址。再用下一个索引从次顶级页目录找到下一个页目录的起始物理地址。直至直到页表的起始物理地址,外加页偏移,计算该虚拟地址对应的实际物理地址。

从上面描述的,从虚拟地址到实际的物理地址,需要耗费一定的时间,TLB(translation lookaside buffer)可以省去中间过程。如果从TLB找到虚拟地址对应的物理地址,则跳过从页目录到页表的翻译过程。TLB会维护虚拟地址到物理地址的对应过程一定的时间。

完整的过程为:当一个虚拟地址(VA)被访问(access),如果该虚拟地址(VA)对应的物理地址(PA)没有找到或不存在,则触发缺页中断(INT E),由缺页处理程序建立该虚拟地址(VA)的页目录页表(PML4、PDP、PDE、PTE),并把虚拟地址(VA)与物理地址(PA)的对应关系记录在TLB中。

二、内存虚拟化

我们下面描述的是内存虚拟化主要用于CPU支持并提供的硬件辅助虚拟化技术当中。

在一台计算机上安装多个虚拟机(VM)时,每个虚拟机(VM)都认为自己独占使用物理内存,都可以独立的访问以0开始的起始物理地址。如下图:

虚拟内存技术用于把虚拟地址VA(virtual Address)转化为物理地址PA(physical address),但有了内存虚拟化技术在原本的虚拟地址翻译为物理地址的过程中又加了一层,把原本的物理地址所(PA)处的位置叫做虚拟机(virtual machine)的物理地址,也叫做GPA(guest physical address)。从而实际的物理地址(PA)叫做VMM(virtual monitor machine)的物理地址,也叫做HPA(host physical address)。

(*注:虚拟机(VM)有的资料上也叫客户机,是一个意思)。

再由VMM(Virtual Machine Monitor)把虚拟机的GPA翻译为HPA。最终达到的效果是VA映射到了HPA。转换过程如下图:

三、虚拟内存和内存虚拟化的关系

如果没有内存虚拟化技术,操作系统通过虚拟地址(VA)访问物理地址(PA)的过程如下:操作系统(OS)把一个虚拟地址分成4个索引值(Index)和一个物理内存页偏移(offset)。4个索引值分别是Index4、Index3、Index2、Index1,分别表示L4(第四级页表PML4T)中的索引、L3(第三级页表PDPT)中的索引、L2(第二级页表PDT)中的索引、L1(第一级页表PT)中的索引。

使用索引值在页表中找到下一级页表的起始物理地址,过程如下:利用CR3寄存器找到PML4T(页表)的起始物理地址(PA),用Index4在PML4T中找到PDPT的起始物理地址(PA);再使用Index3从PDPT 找到PDT的起始物理地址(PA);再使用Index2从PDT中找到PT的起始物理地址(PA);再使用Index1从PT中取出PFN的起始物理地址(PA);最后PFN的物理起始地址加上页内偏移(offset)找到虚拟地址对应的物理地址(PA)。

在内存虚拟化技术下,所有上面提到的物理地址(PA)都将作为虚拟机的物理地址(GPA),需要把所有的GPA借助于CPU内部的EPT(Extended Page Table)转化为HPA,才能被CPU给访问。所以,过程变为了下面这样:

虚拟机里面的操作系统使用的CR3寄存器存放的PML4T的起始物理地址(GPA)需要被VMM(Virtual Machine Monitor)转化为HPA,然后才能使用Index4找到PDPT的起始物理地址(GPA)。继续借助于EPT把PDPT的GPA转化为HPA,再利用Index3找到PDT的起始物理地址(GPA)。继续借助于EPT把PDT的GPA转化为HPA,再利用Index2找到PT的起始物理地址(GPA)。继续借助于EPT把PT的GPA转化为HPA,再利用Index1找到PFN的起始物理地址(GPA)。最后借助于EPT把PFN的GPA转化为HPA,加上页内偏移(offset),得到最后的虚拟地址(VA)对应的HPA。

最后说明下,从GPA到HPA的转化过程如下图:

一个GPA地址也被分成5部分,L4,L3,L2、L1和页内偏移offset。每一部分作为一个索引,Index4,Index3,Index2,Index1,Offset。从EPT取出PML4 Table的基地址,加上Index4*4找到PML4 Entry;并取出PML4 Entry中存放的PDP Table的基地址,加上Index3*4找到PDP Entry;取出PDP Entry中存放的PD Table的基地址,加上Index2*4找到PD Entry;取出PD Entry中存放的PT Table的基地址,加上Index1*4找到物理页帧号PFN;PFN 加上Offset就是最终的物理地址(HPA)。

四、示例

下面简单介绍下代码《Part 7 - Using EPT & Page-level Monitoring Features》,用于了解下EPT的一个应用场景。该代码来源于Hypervisor From Scratch – Part 7: Using EPT & Page-Level Monitoring Features | Rayanfam Blog,演示了EPT的从构建到使用的过程。下面代码跟上面介绍过的内容的唯一不同的点是,页目录(PD)的Large Page标记为1,意味着页目录指向PFN,省去了PTE。每一个PDTE指向的2MB大小的物理内存。

在不同架构的处理器下,4KB物理页面和2MB的物理内存说明如下图:

该代码演示了多CPU对应一个EPT表,修改完EPT需要调用Invept指令使TLB失效。该代码去除了ExAllocatePoolWithTag函数的可执行权限,从而触发VM Exit,进入VMM的处理例程VmxVmexitHandler,然后再恢复ExAllocatePoolWithTag函数的执行权限,允许其可执行。具体过程如下:

初始化完成EPT表后,查找函数ExAllocatePoolWithTag所在的PDE,把该PDE转化为一个包含512个PT的表,找到函数ExAllocatePoolWithTag所在的PTE,然后去除函数ExAllocatePoolWithTag所在的PTE的执行权限。

当调用函数ExAllocatePoolWithTag时,函数ExAllocatePoolWithTag所在PTE标记没有执行权限,触发违例进入VmxVmexitHandler。在处理例程VmxVmexitHandler找到函数ExAllocatePoolWithTag所在的PTE,并恢复可执行权限,最后调用Invept指令刷新TLB。

四、总结

以上,从操作系统层面介绍了虚拟地址与物理地址之间的关系及转化过程,又在引入了硬件辅助虚拟化技术后,介绍了从虚拟机(操作系统处于虚拟机内部)层面的物理地址再到虚拟机监视器的实际的物理地址之间的关系及转化过程。并通过一份开源代码,简单介绍了一下以上内容的一个应用场景。

参考资料:

《系统虚拟化——原理与实现》

《虚拟化技术原理与实现》

《Intel手册卷3》

《虚拟化与云计算》

《Windows Internals Seventh Edition Part 2》

《Part 7 - Using EPT & Page-level Monitoring Features》

硬件辅助虚拟化 之EPT(内存虚拟化)介绍相关推荐

  1. KVM 介绍之CPU和内存虚拟化

    学习 KVM 的系列文章:  (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接 ...

  2. 【KVM系列02】KVM的CPU 和内存虚拟化

    第二章 KVM的CPU 和内存虚拟化 1. 为什么需要 CPU 虚拟化 1.1 基于二进制翻译的全虚拟化(Full Virtualization with Binary Translation) 1. ...

  3. 《深入浅出DPDK》读书笔记(十一):DPDK虚拟化技术篇(I/O虚拟化、CPU虚拟化、内存虚拟化、VT-d、I/O透传)

    Table of Contents DPDK虚拟化技术篇 X86平台上的I/O虚拟化 120.X86平台上的I/O虚拟化 121.X86平台虚拟化概述 122.CPU虚拟化 123.内存虚拟化 124 ...

  4. KVM — 内存虚拟化

    目录 文章目录 目录 内存虚拟化 常规软件内存虚拟化 影子页表技术 EPT 技术 /dev/kvm 设备 内存虚拟化 虚拟化分为软件虚拟化和硬件虚拟化,而且遵循 intercept 和 virtual ...

  5. CPU 和内存虚拟化原理 - 每天5分钟玩转 OpenStack(6)

    前面我们成功地把 KVM 跑起来了,有了些感性认识,这个对于初学者非常重要.不过还不够,我们多少得了解一些 KVM 的实现机制,这对以后的工作会有帮助. CPU 虚拟化 KVM 的虚拟化是需要 CPU ...

  6. 虚拟化的特性、虚拟化要点概述、虚拟化有哪些?

    虚拟化集群特性 如上图包含:物理内存.物理cpu.物理磁盘disk,这里所有的资源都被虚拟成为了虚拟资源(其中还包含网络资源) 虚拟CPU(VCPU) 虚拟内存 虚拟磁盘 还有虚拟网络资源被做成了DV ...

  7. 计算机虚拟化技术操作虚拟化,英特尔虚拟化技术(VT-x)是什么

    英特尔的硬件辅助虚拟化技术(Vanderpool Technology,简称VT技术)是一种设计更简单.实施更高效和可靠的方法,是世界上首个X86平台的硬件辅助虚拟化解决方案.它对如何在不同的情形下分 ...

  8. 虚拟化基础-华为云计算虚拟化

    虚拟化基础-华为云计算虚拟化 一.什么是虚拟化 1.虚拟化的概念 2.虚拟化的理解 ①vmware官方描述 ②通俗理解 3.虚拟化的特点 二.虚拟化的重要发展历史 三.计算虚拟化发展图示 四.三种虚拟 ...

  9. KVM硬件辅助虚拟化之 EPT(Extended Page Table)

    传统OS环境中,CPU对内存的訪问都必须通过MMU将虚拟地址VA转换为物理地址PA从而得到真正的Physical Memory Access,即:VA->MMU->PA,见下图. 虚拟执行 ...

最新文章

  1. MCSE2003学习之四
  2. 面向对象软件设计——设计模式学习
  3. 在windows 实现执行 makefile
  4. linux之如何快速查看文件的大小
  5. 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
  6. java报错空指针异常_java – 空指针异常错误,没有明显的代码错误
  7. codewars033: Duplicate Encoder 重复编码器
  8. 用java求解八枚银币问题_算法笔记_004:8枚硬币问题【减治法】
  9. JavaScript之浏览器大战
  10. 【spring cloud】(四)服务网关——gateway
  11. Fomo玩法加持的PixelMaster为什么火了?
  12. 【转载】优雅抒情的浪漫小提琴曲
  13. Java实现 谁不爱打牌
  14. Android 4.4 Kit Kat 源码下载
  15. 什么样的导师最坑学生?
  16. 调研:暴恐识别(图像识别)by_xxzcc
  17. ant-design中取消tab激活时候的下划线、以及修改tab激活时候下划线颜色
  18. 最近16款免费的Wordpress主题
  19. 【高频电子线路】——高频小信号放大器学习笔记总结
  20. 计算机十二种常用密码破解法

热门文章

  1. egg-socket-io的demo案例
  2. module ‘win32com.gen_py.00020813-0000-0000-C000-000000000046x0x1x9‘ has no attribute ‘CLSIDToClassM
  3. 4万字【Python高级编程】保姆式教学,Python大厂高频面试题解析
  4. Effective Scala
  5. vue-购物车小球抛物线
  6. Games101学习笔记(一)
  7. 盘点那些冷门又有趣的大学专业,你的学校有啥奇葩专业?
  8. 新概念英语第四册01-15课(转)
  9. android 多个catch,【Android开发坑系列】之try-catch
  10. 脚本小子进阶之路(一)用开源武装自己