VT 入门番外篇——初识 VT
写在前面
此系列是本人一个字一个字码出来的,包括示例和实验截图。由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我。
你如果是从中间插过来看的,请仔细阅读 羽夏看Win系统内核——简述 ,方便学习本教程。
看此教程之前,问几个问题,基础知识储备好了吗?保护模式篇学会了吗?练习做完了吗?没有的话就不要继续了。
🔒 华丽的分割线 🔒
初识
如下的内容节选自New Blue Pill
并略微修改以更好的入门VT
。如果自己了解这些基本概念,就没必要看初识了。
在讨论VT
之前我们首先谈谈虚拟概念。虚拟virtualization
是指对计算机资源的抽象,一种常用的定义是:“虚拟就是这样的一种技术,它隐藏了系统、应用和终端用户赖以交互的计算机资源的物理性的一面,最常用的方法就是把单一的物理资源转化为多个逻辑资源,当然也可以把多个物理资源转化为一个逻辑资源(这在存储设备和服务器上很常见)。”
在2005年和2006年,Intel
和AMD
都开发出了支持硬件虚拟技术的CPU
,也就是在此时,x86
平台才真正有可能实现完全虚拟化。2007年年初,Intel
还进一步地发布了VT-d
技术规范,从而在硬件上支持IO
操作的虚拟化。随着硬件虚拟化技术越来越广泛的采用,开发者也开始用虚拟技术来做一些其他的事情。
有了虚拟技术的基本概念,下面我们谈谈硬件虚拟化技术HEV
。硬件虚拟化技术Hardware Enabled Virtualization,HEV
也就是在硬件层面上,更确切地说是在CPU
里对虚拟技术提供直接支持,并通过这种设计提高虚拟效率、降低开发难度。在硬件虚拟化技术诞生前,在编写虚拟机的过程中,为了实现多个虚拟机上的真实物理地址隔离,需要编程实现把客户机的物理地址翻译为真实机器的物理地址。同时也需要给不同的客户机操作系统编写不同的虚拟设备驱动程序,使之能够共享同一真实硬件资源。硬件虚拟化技术则在硬件上实现了内存地址甚至于IO
设备的映射,因此大大简化了编写虚拟机的过程。而其硬件直接支持二次寻址和I/O
映射的特性也提升了虚拟机在运行时的性能。
在硬件虚拟化技术中,一个重要的概念就是VMM
,英文全称为Virtual Machine Monitor
,有的书称之为Hypervisor
,它专指在使用硬件虚拟化技术时创建出的特权层,该层提供给虚拟机开发者,用来实现虚拟硬件与真实硬件的通信和一些事件处理操作,因此它的权限级别要大于或等于操作系统权限。如下为硬件虚拟化技术架构示意图:
如下是VMM
的使用架构示意图:
由于我们介绍的是Intel
的VT
技术,所以我们关注的是Intel-VTx
。在VT
技术中,设计架构上同样存在两种角色—虚拟机管理器Virtual Machine Monitors,VMM
和客户机Guest
,两者分处在VMX root
和VMX non-root
两种模式下。VT
技术的设计目标如下。
对于VMM
层,进入此层则代表进入了VMX root
模式:
- 为每个虚拟机提供虚拟处理器,并且可以在恰当的时候把它放在真正的物理处理器上,从而使得这个虚拟处理器可以处理指令。
VMM
层可以控制处理器资源、物理内存、管理中断和IO
操作。
对于Guest Machine
,进入此层则代表进入了VMX non-root
模式:
- 每个虚拟机使用相同的接口来使用虚拟处理器、内存、存储设备等资源。
- 每个虚拟机可以独立地不受干扰地运行,虚拟机间都是相互独立的。
- 对于虚拟机来说,
VMM
层像是完全透明的。
如下是VMM
的生命周期示意图:
之前我们学过内核、驱动以及程序编写,我们可以做一个对比:
有了这些基本概念之后,我们就可以比较方便的继续后续的入门。
准备
在简述当中,我们强调了要求有驱动开发的基础,如果不会的话,请把 羽夏看Win系统内核——驱动篇 学习完毕再回来进行,当然保护模式的知识是基础也不要落下。
要实现VT
最小框架,就需要一些汇编指令,比如vmxon
等指令。这一切的一切编译器并没有提供,但是,微软帮我们实现了这些功能,使得我们不必需要自己写汇编来实现,提高代码的可移植性,否则我们写32
位的VT
移植到64
位有一些是不一样的,需要自己重新修改构建。只需要在驱动项目中引用intrin.h
这个头文件即可使用,x86 内部函数列表 中包含了所有的微软帮我们实现的函数。
由于我们是最小的VT
架构实现,请把虚拟机按照我们初学保护模式的配置:单核、32位的WinXP
,于此同时要开启嵌套VT-x/AMD/V
,否则就算你的VT
架构代码写的是对的,也报错:
推荐项目
在GitHub
上有比较成熟的项目 HyperPlatform ,学习好入门之后,可以根据自己的需要进行拓展。
下一篇
本文来自博客园,作者:寂静的羽夏 ,一个热爱计算机技术的菜鸟
转载请注明原文链接:https://www.cnblogs.com/wingsummer/p/15967799.html