写在前面

  此系列是本人一个字一个字码出来的,包括示例和实验截图。由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新。 如有好的建议,欢迎反馈。码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作。如想转载,请把我的转载信息附在文章后面,并声明我的个人信息和本人博客地址即可,但必须事先通知我

你如果是从中间插过来看的,请仔细阅读 羽夏看Win系统内核——简述 ,方便学习本教程。

  看此教程之前,问几个问题,基础知识储备好了吗?保护模式篇学会了吗?练习做完了吗?没有的话就不要继续了。


华丽的分割线


初识

  如下的内容节选自New Blue Pill并略微修改以更好的入门VT。如果自己了解这些基本概念,就没必要看初识了。

  在讨论VT之前我们首先谈谈虚拟概念。虚拟virtualization是指对计算机资源的抽象,一种常用的定义是:“虚拟就是这样的一种技术,它隐藏了系统、应用和终端用户赖以交互的计算机资源的物理性的一面,最常用的方法就是把单一的物理资源转化为多个逻辑资源,当然也可以把多个物理资源转化为一个逻辑资源(这在存储设备和服务器上很常见)。”

  在2005年和2006年,IntelAMD都开发出了支持硬件虚拟技术的CPU,也就是在此时,x86平台才真正有可能实现完全虚拟化。2007年年初,Intel还进一步地发布了VT-d技术规范,从而在硬件上支持IO操作的虚拟化。随着硬件虚拟化技术越来越广泛的采用,开发者也开始用虚拟技术来做一些其他的事情。

  有了虚拟技术的基本概念,下面我们谈谈硬件虚拟化技术HEV。硬件虚拟化技术Hardware Enabled Virtualization,HEV也就是在硬件层面上,更确切地说是在CPU里对虚拟技术提供直接支持,并通过这种设计提高虚拟效率、降低开发难度。在硬件虚拟化技术诞生前,在编写虚拟机的过程中,为了实现多个虚拟机上的真实物理地址隔离,需要编程实现把客户机的物理地址翻译为真实机器的物理地址。同时也需要给不同的客户机操作系统编写不同的虚拟设备驱动程序,使之能够共享同一真实硬件资源。硬件虚拟化技术则在硬件上实现了内存地址甚至于IO设备的映射,因此大大简化了编写虚拟机的过程。而其硬件直接支持二次寻址和I/O映射的特性也提升了虚拟机在运行时的性能。

  在硬件虚拟化技术中,一个重要的概念就是VMM,英文全称为Virtual Machine Monitor,有的书称之为Hypervisor,它专指在使用硬件虚拟化技术时创建出的特权层,该层提供给虚拟机开发者,用来实现虚拟硬件与真实硬件的通信和一些事件处理操作,因此它的权限级别要大于或等于操作系统权限。如下为硬件虚拟化技术架构示意图:

  如下是VMM的使用架构示意图:

  由于我们介绍的是IntelVT技术,所以我们关注的是Intel-VTx。在VT技术中,设计架构上同样存在两种角色—虚拟机管理器Virtual Machine Monitors,VMM和客户机Guest,两者分处在VMX rootVMX non-root两种模式下。VT技术的设计目标如下。

  对于VMM层,进入此层则代表进入了VMX root模式:

  1. 为每个虚拟机提供虚拟处理器,并且可以在恰当的时候把它放在真正的物理处理器上,从而使得这个虚拟处理器可以处理指令。
  2. VMM层可以控制处理器资源、物理内存、管理中断和IO操作。

  对于Guest Machine,进入此层则代表进入了VMX non-root模式:

  1. 每个虚拟机使用相同的接口来使用虚拟处理器、内存、存储设备等资源。
  2. 每个虚拟机可以独立地不受干扰地运行,虚拟机间都是相互独立的。
  3. 对于虚拟机来说,VMM层像是完全透明的。

  如下是VMM的生命周期示意图:

  之前我们学过内核、驱动以及程序编写,我们可以做一个对比:

  有了这些基本概念之后,我们就可以比较方便的继续后续的入门。

准备

  在简述当中,我们强调了要求有驱动开发的基础,如果不会的话,请把 羽夏看Win系统内核——驱动篇 学习完毕再回来进行,当然保护模式的知识是基础也不要落下。

  要实现VT最小框架,就需要一些汇编指令,比如vmxon等指令。这一切的一切编译器并没有提供,但是,微软帮我们实现了这些功能,使得我们不必需要自己写汇编来实现,提高代码的可移植性,否则我们写32位的VT移植到64位有一些是不一样的,需要自己重新修改构建。只需要在驱动项目中引用intrin.h这个头文件即可使用,x86 内部函数列表 中包含了所有的微软帮我们实现的函数。

  由于我们是最小的VT架构实现,请把虚拟机按照我们初学保护模式的配置:单核、32位的WinXP,于此同时要开启嵌套VT-x/AMD/V,否则就算你的VT架构代码写的是对的,也报错:

推荐项目

  在GitHub上有比较成熟的项目 HyperPlatform ,学习好入门之后,可以根据自己的需要进行拓展。

下一篇

  VT 入门番外篇——最小 VT 实现(上)

VT 入门番外篇——初识 VT的更多相关文章

  1. 羽夏看Win系统内核—— VT 入门番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  2. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  3. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  4. Opengl_入门学习分享和记录_番外篇01(MacOS上如何在Xcode 开始编辑OpenGL)

    写在前面的废话: 哈哈 ,我可真是勤勉呢,今天又来更新了,这篇文章需要大家接着昨天的番外篇00一起食用! 正文开始: 话不多说,先看代码. 这里主要全是使用的glfwwindowhint 这个函数,他 ...

  5. 渗透测试思路 - CTF(番外篇)

    渗透测试思路 ​ Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) ​ 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 ​ 本篇 ...

  6. 羽夏看Win系统内核—— x64 番外篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  7. x64 番外篇——知识铺垫

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  8. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  9. 可视化(番外篇)——在Eclipse RCP中玩转OpenGL

    最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...

随机推荐

  1. C#字符串Unicode转义序列编解码

    C#字符串Unicode转义序列编解码 在开发过程中时常会遇到"\Uxxxx"格式表示的字符,实际上"xxxx"是字符的Unicode码的十六进制表示方式.这种 ...

  2. Spring Boot数据访问之数据源自动配置

    Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...

  3. 日行一算(Consecutive Integer-连续整数)

    题目 题目描述 2005年的百度之星初赛有这么一道题,一个正整数有可能可以被表示为 m(m>1) 个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8 但现在你的任务 ...

  4. CentOS单机安装k8s并部署.NET 6程序 压测 记录

    前面部分依照CentOS单机安装k8s并部署.NET 6程序来进行,内存.cpu.centos版本一致,之前222元买的三年8M 2c4g腾讯云轻量服务器,这个教程算是写的很详细的了,基本可以一致执行 ...

  5. ftp用的是tcp还是udp_如何通俗地解释TCP和UDP协议和HTTP、FTP、SMTP等协议之间的区别

    HTTP协议 老王喜欢看岛国小片,时常泡在论坛上和网友交流最新资讯,老王是通过浏览器浏览网页的,而浏览器是借助HTTP协议与论坛服务器沟通交流. FTP协议 老王购买了该网站的会员,可以无限制下载高清 ...

  6. 拒绝踩雷!全能的BI软件非它莫属

    BI工具现在是越来越火了,很多公司都会利用这些工具,提高工作效率.但是目前市面上的BI产品真的是越来越多,稍有不慎就会踩雷,那么我们应该要怎么选择这些BI工具呢?今天我为大家选了3款国内外口碑不错的B ...

  7. 零售BI解决方案_新零售时代转型升级思路全都在这里

    新零售是什么意思?新零售即企业以互联网为依托,通过运用大数据.人工智能等先进技术手段,对商品的生产.流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务.线下体验以及现代物流进行深度融合 ...

  8. NFA转化为DFA

    NFA(不确定的有穷自动机)转化为DFA(确定的有穷自动机) NFA转换DFA,通常是将带空串的NFA(即:ε-NFA)先转化为不带空串的NFA(即:NFA),然后再转化为DFA. 提示:ε是空串的意 ...

  9. C# init用法

    init是什么意思? init就 modreq([System.Runtime]System.Runtime.CompilerServices.IsExternalInit) 类型的缩写 modreq ...

  10. 无法将具有语句体的lambda表达式转换为表达式树

    很早就碰到了这个问题,当时也没有深入的研究,趁着空闲,遂把这个问题研究清楚. (一)普通案例 下面从一个普通的案例入手,下面准备两个List集合,都是放在内存里面的(需要模拟到远端执行的时候,我们是通 ...