Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1291080
  • 博文数量: 494
  • 博客积分: 161
  • 博客等级: 入伍新兵
  • 技术积分: 5084
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-01 07:37
个人简介

只有偏执狂才能生存

文章分类

全部博文(494)

文章存档

2016年(10)

2015年(112)

2014年(69)

2013年(275)

2012年(28)

分类: 虚拟化

2015-07-06 10:31:49

1.1 Smart-VM虚拟化层

在使用Intel-VT技术之前,Smart-VM需要先激活VMX模式。为了激活VMX模式,处理器需要先进入保护模式。

当处理器在保护模式下未进入VMX模式的时候,跟普通处理器的保护模式操作是一样的。当处理器激活VMX模式,进入VMX根操作模式时,基本上跟正常的处理器在保护模式下的操作是一样的,但是VMX根操作模式多了几条操作VMX模式的指令。

VMX非根操作模式下虚拟的是保护模式。但是跟正常的保护模式有差别,比如说当客户操作系统在VMX非根操作模式下运行的时候,需要访问硬件资源的时候,就需要回到VMX根模式,交由虚拟机监控器处理。

VMX架构中,虚拟机监控器放在VMX的根操作模式下,用于管理计算机的硬件资源,同时为客户操作系统虚拟他们所需的虚拟硬件资源。客户操作系统运行在VMX非根操作模式下。

1.2 虚拟服务分发器

虚拟服务分发器在Smart-VM虚拟化层所处的位置如图5.4所示。

虚拟服务分发器会维护一种虚拟服务表,这张表的每个条目对应的是一个服务函数。当处理器从非根操作模式退出到根操作模式下的时候,都可以从这个虚拟服务表中找到相应的服务函数进行处理。从非根操作模式退出到根操作模式下的基本原因存放在Basic VM-Exit Information域。

1.3 激活VMX模式

1.3.1 激活VMX模式的条件

第一代Intel-VT技术,在激活VMX模式的时候,需要将CR0.PECR0.NE CR0.PGCR4.VMXE设置为1,即开启VMX模式需要先开启保护模式和分页机制。

1.3.2 激活VMX模式的流程

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 1判断和设置进入VMX所需条件的流程图

7.1显示了Smart-VM激活VMX模式的流程图:

a)        开启保护模式和虚拟内存机制:在加载程序的时候,已经开启了保护模式和分页机制。具体参看引导程序和加载程序部分;

b)        判断是否支持CPUID指令;

c)        判断该处理器是否有支持Intel-VT技术;

d)       开启VMX操作:

                        i.              激活VMX指令操作:置IA32_FEATURE_CONTROL.bit21

                      ii.              锁定MSR寄存器:置IA32_FEATURE_CONTROL.bit01

                    iii.              CR0.NECR4.VME1

                    iv.              设置VMCS revision id

                      v.              执行VMXON指令,激活VMX模式;

1.4 CPU虚拟化

1.4.1 实模式虚拟化

真实的机子在启动的时候,进入的是实模式,然后从实模式跳转到保护模式。虚拟机监控器也需要虚拟这个过程。但是当处理器进入VMX非根操作模式是,处理器只有虚拟8086模式和保护模式两种。因此,要虚拟实模式,一般采用以下两种方式:

a)        实现一个模拟实模式的模块;

b)        利用虚拟8086模式;

Smart-VM采用第二种方法来虚拟实模式。

利用虚拟8086模式来实现实模式的虚拟化同样也有两种方法:

a)        利用保护模式下的虚拟8086模式;

b)        利用VMX非根操作操作模式下的保护模式下的虚拟8086模式;

7.2的着色部分显示了虚拟8086模式在处理器各个模式中所处的位置。如果利用保护模式下的虚拟86模式,那么需要进行保护模式和VMX模式之间的切换,因此,我们采用第二种方法,即使用VMX非根操作模式下的保护模式下的虚拟8086模式。

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 2 虚拟8086模式

虚拟8086模式在保护模式下是运行在特权级3的,因此跟实模式还是有一些差别的:

1.      不能运行特权级指令;

2.      中断机制采用的是保护模式下的中断机制,而不是BIOS中断;

3.      I/O操作,也需要遵循保护模式下的保护机制;

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 3 虚拟8086在保护模式下的切换

7.3显示了虚拟8086在保护模式下的切换。

虚拟8086监控器实际上是作为Smart-VM虚拟化层的一个子模块,如图7.4所示。

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 4 Smart-VM虚拟8086监控器架构图

由图7.4可以看出,虚拟8086监控器模块既可以在VMX根操作模式下运作,也在VMX非根操作模式下运作:

a)        8086程序在非根操作模式下运行的时候,可能由于一些原因(比如说执行int指令)而退出到VMX非根操作模式下的虚拟8086监控器,此时的虚拟机监控器是在VMX非根操作模式下的特权级0下;

b)        虚拟8086监控器也可能由于一些原因(比如说I/O操作)而退出到VMX根操作模式;

在虚拟8086模式下虚拟实模式,需要处理好以下几个问题:

1.4.1.1 进入NOT-ROOT模式下的虚拟8086模式

VMCSguest-state中的eflagsVM1,即可进入非根操作模式下的虚拟8086模式。关于其他客户域的寄存器的设置,跟进入保护模式下的客户域的设置有所不同,请参看下面的表。

1.4.1.2 处理软件异常

Smart-VM将所有的软件异常,都转交给Smart-VM虚拟机监控器,由它处理。

但是当虚拟机监控器处理完一个异常的时候,需要在进入非根模式的时候,插入事件说明,告诉处理器,虚拟机监控器处理完了一个异常。如果同一个客户操作系统,在产生一个异常之后,虚拟机监控器未处理完,又产生一个异常,那系统就会产生双重故障。

1.4.1.3 处理特权级指令

在虚拟8086模式下,由于是在特权级3下运行,因此执行特权级指令会产生异常。Smart-VM设置了相关的位,让处理器能够捕获客户操作系统的软件异常,并且转交给Smart-VM虚拟机监控器。

1.4.1.4 非根操作模式下的BIOS虚拟化

在实模式下,需要通过BIOS中断,才能够访问硬件,比如说读取硬盘或者软盘数据等。但是,在虚拟8086模式下,中断只能通过保护模式下的中断机制来实现。因此,我们在中断向量表上,需要根据BIOS的中断向量表实现一整套的BIOS中断。

当虚拟8086模式下的程序执行int指令的时候,就产生软件中断,转入虚拟8086监控器,由虚拟8086监控器处理。

1.4.1.5 从非根操作模式下的虚拟8086模式进入非根操作模式下的保护模式

VMCS控制域的CR0 guest/host mask 域置为0xFFFFFFFF,这样,当处理器在操作CR0控制寄存器的时候,就会产生VM-exit。当Smart-VM虚拟机监控器获取操作CR0寄存器的指令时,就可以分析该指令,以此决定下一步该采取什么样的操作。

英特尔手册规定,在保护模式下,当cr0.PE位为1时,下一条指令就要是jmp或者call指令,直接跳转到保护模式。根据这个规定,当我们获取在虚拟8086模式下将cr0.pe位置1的指令时,在返回VMX非根模式时,返回的是VMX非根模式下的保护模式,这样,当执行jmp或者call指令的,就可以装载好选择子和EIP

在进入保护模式的时候,需要设置好的置如表7.6[20]

1.4.1.6 进入虚拟8086模式的VMCS配置

客户域

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 1 进入虚拟8086模式的客户域配置

Guest-state 寄存器域

CR0 = 0xC0000021

CR3 = Smart-VM虚拟机监控器的CR3

CR4 = 0x2000

DR7 = 0x400

RSP = 0x0

RIP = 0x7C00

EFLAGS = 0x23002

CS_SELECTOR = 0

CS_BASE = 0

CS_LIMIT = 0xFFFF

CS_AR_BYTES = 0xF3

SS_SELECTOR = 0

SS_BASE = 0

SS_LIMIT = 0xFFFF

SS_AR_BYTES = 0xF3

DS_SELECTOR = 0

DS_BASE = 0

DS_LIMIT = 0xFFFF

DS_AR_BYTES = 0xF3

ES_SELECTOR = 0

ES_BASE = 0

ES_LIMIT = 0xFFFF

ES_AR_BYTES = 0xF3

FS_SELECTOR = 0

续表  STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 2 进入虚拟8086模式的客户域配置

Guest-state 寄存器域

FS_BASE = 0

FS_LIMIT = 0xFFFF

FS_AR_BYTES = 0xF3

GS_SELECTOR = 0

GS_BASE = 0

GS_LIMIT = 0xFFFF

GS_AR_BYTES = 0xF3

LDTR _SELECTOR = 0

LDTR _BASE = 0

LDTR _LIMIT = 0xFFFF

LDTR _AR_BYTES = 0x82

TR _SELECTOR = 0x18

TR _BASE = Smart-VM虚拟机监控器的tss基址

TR _LIMIT = Smart-VM虚拟机监控器的tss大小

TR _AR_BYTES = 0x8b

GDTR_BASE =Smart-VM虚拟机监控器GDT的基址

GDTR_LIMIT = Smart-VM虚拟机监控器的GDT的大小

IDTR的基址=Smart-VM虚拟机监控器IDT的基址

IDTR_LIMIT = Smart-VM虚拟机监控器的IDT的大小

Guest-state 非寄存器域

GUEST_ACTIVITY_STATE = 0

GUEST_INTERRUPTIBILITY_INFO = 0

续表  STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 3 进入虚拟8086模式的客户域配置

Guest-state 非寄存器域

GUEST_PENDING_DBG_EXCEPTIONS = 0

VMCS_LINK_POINTER = 0xFFFFFFFF_FFFFFFFF

宿主域

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 4 进入虚拟8086模式的宿主域配置

Host-state 寄存器域

CR0 = Smart-VM虚拟机监控器的CR0

CR3 = Smart-VM虚拟机监控器的CR3

CR4 = Smart-VM虚拟机监控器的CR4

RIP = gos->vmexit_func

RSP = 0xC009f000

CS的选择子= Smart-VM虚拟机监控器的CS的选择子

SS的选择子 = Smart-VM虚拟机监控器的SS的选择子

DS的选择子 = Smart-VM虚拟机监控器的DS的选择子

ES的选择子 = Smart-VM虚拟机监控器的ES的选择子

FS的选择子 = Smart-VM虚拟机监控器的FS的选择子

GS的选择子 = Smart-VM虚拟机监控器的GS的选择子

TR的选择子 = Smart-VM虚拟机监控器的TR的选择子

GDTR的基址=Smart-VM GDT的基址

续表  STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 5 进入虚拟8086模式的宿主域配置

Host-state 寄存器域

IDTR的基址=Smart-VM虚拟机监控器IDT的基址

执行控制域

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 6 进入虚拟8086模式的执行控制域

Pin-Based VM-Execution Controls

External-interrupt exiting = 0

NMI exiting = 0

Virtual NMIs = 0

Activate VMX-preemption timer = 0

Processor-Based VM-Execution Controls

Interrupt-window exiting = 0

Use TSC offsetting = 0

HLT exiting = 0

INVLPG exiting = 0

MWAIT exiting = 0

RDPMC exiting = 0

RDTSC exiting = 0

CR3-load exiting = 0

CR3-store exiting = 0

CR8-load exiting = 0

CR8-store exiting = 0

Use TPR shadow = 0

NMI-window exiting = 0

MOV-DR exiting = 0

Unconditional I/O exiting = 1

Use I/O bitmaps = 0

Monitor trap flag = 0

Use MSR bitmaps = 0

MONITOR exiting = 0

续表  STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 7 进入虚拟8086模式的执行控制域

Processor-Based VM-Execution Controls

 

PAUSE exiting = 0

Activate secondary controls = 0

EXCEPTION_BITMAP

全部置为1

进入控制域

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 8 进入虚拟8086模式的进入控制域

VM-Entry Controls

Load debug controls = 0

IA-32e mode guest = 0

Entry to SMM = 0

Deactivate dual-monitor treatment = 0

Load IA32_PERF_GLOBAL_CTRL = 0

Load IA32_PAT = 0

Load IA32_EFER = 0

退出控制域

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 9 进入虚拟8086模式的退出控制域

VM-Exit Controls

Save debug controls = 0

Host address-space size = 0

Load IA32_PERF_GLOBAL_CTRL = 0

Acknowledge interrupt on exit = 0

Save IA32_PAT = 0

Load IA32_PAT = 0

Save IA32_EFER = 0

Load IA32_EFER = 0

Save VMX-preemption timer value = 0

1.4.1.7 从实模式跳转到保护模式下的VMCS配置

 STYLEREF 1 \s 7. SEQ \* ARABIC \s 1 10 从实模式跳转到保护模式下的VMCS配置

RFLAGS = 0x03002

RIP = 下一条指令的地址

CS_SELECTOR = 0x08

CS_BASE = 0x90000

CS_LIMIT = 0xFFFFFFFF

CS_AR_BYTES = 0x809b

SS_SELECTOR = 0x10

SS_BASE = 0

SS_LIMIT = 0xFFFFFFFF

SS_AR_BYTES = 0x8093

GDTR_BASE =客户操作系统的GDT的基址

GDTR_LIMIT = 客户操作系统的GDT的大小

1.5 内存虚拟化

Smart-VM虚拟机监控器采用的是第一代处理器虚拟化。

分配给客户操作系统的内存,是通过映射虚拟内存页表实现,然后将表传递给客户操作系统的CR3实现的。因此,客户操作系统所有关于CR3的操作,都要由Smart-VM虚拟机监控器处理。

1.6 本章小结

本章介绍了Smart-VM虚拟化层的实现:

a)        虚拟服务分发器:客户操作系统对虚拟机监控器的请求,需要经过虚拟服务分发器,才能够到达相应的模块;

b)        激活VMX模式:先对处理器等进行了有效的验证,再进行相关的配置,最后启动VMX模式;

c)        处理器虚拟化的实现:实现了部分8086指令的虚拟化和80x86功能的部分虚拟化;

d)       内存虚拟化的实现:使用影子页表;

阅读(755) | 评论(0) | 转发(0) |
0

上一篇:虚拟化技术漫谈

下一篇:intel vmm

给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册