Electronic Joint Business

Solution for E-Business

asm

从虚拟化到云计算 (三) 编写自己的 VMWare

我一直认为要了解虚拟化,最好的方法是自己编写一个 VMM 应用程序。这有助于对硬件辅助虚拟化技术的深入理解。本文将离开前面两篇文章的理论论述,开始动手编写一个自己的 VMWare。1

本文将要创建的应用程序将会完成: 做好CPU 虚拟化的预备工作;创建客户机;进入并退出该客户机。为了简单起见,我们只针对 X64 模式来实现。该代码只演示了基本的 VMX 功能,也不一定兼容你手上的 CPU,你不过你可以使用 Bochs 并启用虚拟化,然后你就可以测试这些代码了。

我们先对专有名词做一下简单介绍:

  • VMM (虚拟机监视器 — Virtual Machine Monitor) 宿主程序
  • VM (虚拟机 —Virtual Machine)客户机程序
  • 根操作 (Root Operation) VMM 所执行的代码与上下文
  • 非根操作 (Non Root Operation) VM 所执行的代码与上下文
  • VMX 切换: 从宿主机切换到客户机(VMEntry) 或者从客户机切换到宿主机 (VMExit)
  • VMCS:控制 VM 和 VMX 切换的数据结构
  • VM Entry: 从宿主机到客户机的切换
  • VM Exit:由于某种原因,从客户机到宿主机的切换

VMX 操作的生命周期

  • VMM 检查 CPU 是否支持虚拟化 (CPUID) 并启用 (CR4 和 VMXON)
  • VMM 为每一个 VM 初始化一个 VMCS 控制结构。通过 VMPTRST 和 VMPTRLD 指令告诉 CPU 其指针的位置。VMCS 的读写通过指令 VMREAD, VMWRITE 和 VMCLEAR 来完成。
  • VMM 通过 VMLAUNCH 或者 VMRESUME 指令进入 VM
  • VM 通过 VMEXIT 退出到 VMM
  • 反复进行上面的操作
  • VMM 执行 VMXOFF 将自己关闭

 

, , , , , , ,

在 Visual C++ 中使用嵌入汇编

文章评价:
如果你的应用对性能要求十分严苛,使用汇编语言来进行编程无疑是最佳选择。不过,编程技术发展到今天,代码动辄百万行,直接用汇编语言来进行编程,成本实在太高了。作为一种折中方案,你可以选择在部分代码里使用汇编语言 — Inline Assembly 以达到改善性能的目的。
 
所谓嵌入汇编 — Inline Assembly 也叫做内联汇编,即直接在 C/C++ 代码里加入汇编语言代码。同传统的汇编方式相比,我们可以完全避免那些烦琐的汇编和链接步骤,可以直接在汇编代码中使用 C 变量名和函数名 。这样一来汇编代码就能够很容易地 C 语言程序紧密而自然地结合在一起了。另外,由于是把汇编语句和 C 或者 C++ 语句混合在一起进行编程,我们还将可以实现许多原来光凭 C 或者 C++ 语句无法办到的事。GCC, Visual C++ 等都提供了各自的嵌入汇编的实现。在 Visual C++ 中使用嵌入汇编不需要额外的编译器和联接器,十分的方便。

在 VC++ 中,嵌入汇编主要用于如下场合:

  • 使用汇编语言写函数;
  • 实现那些对速度要求非常高的代码;
  • 设备驱动程序中用于直接访问硬件;
  • “Naked” 函数的 prolog 和 epilog。

所谓 Naked 的函数,VC++ 不帮着做栈处理,需要用户自己取输入参数、保护寄存器、甚至自己写 ret 等等,因此称为 “纯粹”的函数(asm 函数)。有关 Naked 函数可以参考: Rules and Limitations for Naked Functions

嵌入汇编代码的缺点也很明显:代码不易于移植,如果你的程序打算在不同类型的机器(比如 x86 和 ARM)上运行,应当尽量避免使用嵌入汇编。特别要注意,微软在 64 位 VC++ 上已经不再支持嵌入汇编。这时候你应该使用 MASM,因为 MASM 支持更方便的的宏指令和数据指示符。

嵌入汇编关键字
在 Visual C++ 中加入嵌入汇编是只需要使用 __asm 关键字,这点和 C++ 标准不同,VC 不支持 C++ 中的 asm 关键字,所以你需要使用 __asm(两个下划线)关键字来编写你的嵌入汇编代码。这个关键字有两种使用方法:

>>> 阅读全文

 

, , , ,