KVM保证guest OS正确执行的手段就是当guest执行I/O指令或者其他特权指令时,引发处理器异常,从而进入到根操作模式(Intel 的VT-x技术)。

当guest OS执行一些特权指令或者外部事件时,比如I/O访问,对控制寄存器的操作,对MSR(Machine Special Register)的读写操作、数据包的到达等,都会引起CPU发生 VM Exit,发生VM Exit后,KVM 会将guest OS 的状态保存到VMCS中,把Host的状态装入物理CPU,处理器进入根操作模式。接着KVM会读取保存的VMCS中 VM_EXIT_REASON字段的内容,从而知道虚拟机退出的原因。如果由于I/O信号到达,则退出到用户模式,交给Qemu来处理,处理完毕后,再通过KVM重新进入guest OS运行;如果是外部中断,则有KVM做一些必要的处理再返回。

以上内容算是对 前一篇文章的回顾,前一篇文章在结尾处提到了VMCS,那么本文继续。

不难看出,与异常处理机制相关的结构就是VMCS。VMCS占一页大小,该结构包含3个部分:版本标志、VMX退出原因、数据区。而数据区则包含大量与CPU状态和控制相关的信息,包括虚拟机状态保存区(各种寄存器)、宿主机状态保存区、VM Execution控制域、VM Entry控制域、VM Exit控制域、VM Exit信息域。Intel提供的一些指令可以用来直接操作这些域。

VMX 指令集

  • VMPTRLD         加载一个VMCS结构体指针作为当前操作对象
  • VMPTRST         保存当前VMCS结构体指针
  • VMCLEAR       清除当前VMCS结构体
  • VMREAD          读VMCS结构体指定域
  • VMWRITE         写VMCS结构体指定域
  • VMCALL          引发一个VM Exit事件,返回到VMM
  • VMLAUNCH   启动一个虚拟机
  • VMRESUME   从VMM返回到虚拟机继续运行
  • VMXOFF          退出VMX操作模式
  • VMXON           进入VMX操作模

唔。。。写道这里写不下去了,感觉也没什么可写的了,功力不够啊!!

下一篇日志将会介绍KVM的内存管理部分。包括影子页表机制,EPT,嵌套MMU等等。(大牛请轻拍。)

—————update————-
这篇日志上周就写了,这几天看了一些影子页表,发现比想象中的难。KVM的代码(包括整个linux kernel的代码)函数调用关系非常复杂,加上目前KVM的资料非常少,所以很吃力,不过已经挖了这个坑了,再怎么样也要努力填吧。。。。

今天把KVM的代码放下,读了读NoSQL数据库 Redis的代码,感觉比KVM要简单多了,不知道为什么会这样?
是因为本身redis的代码就清晰,还是因为我体系结构学得不好,而KVM的代码主要又是集中在CPU相关的硬件这一块,所以才会这么吃力? 求指点。。。。

—————end——————

参考资料
【1】 Intel VT-x 技术简介
【2】 x86硬件辅助虚拟化之迷

10,690 views
Home

11 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.