分类: 虚拟化
2010-07-19 18:56:06
在使用Intel-VT技术之前,Smart-VM需要先激活VMX模式。为了激活VMX模式,处理器需要先进入保护模式。
当处理器在保护模式下未进入VMX模式的时候,跟普通处理器的保护模式操作是一样的。当处理器激活VMX模式,进入VMX根操作模式时,基本上跟正常的处理器在保护模式下的操作是一样的,但是VMX根操作模式多了几条操作VMX模式的指令。
VMX非根操作模式下虚拟的是保护模式。但是跟正常的保护模式有差别,比如说当客户操作系统在VMX非根操作模式下运行的时候,需要访问硬件资源的时候,就需要回到VMX根模式,交由虚拟机监控器处理。
在VMX架构中,虚拟机监控器放在VMX的根操作模式下,用于管理计算机的硬件资源,同时为客户操作系统虚拟他们所需的虚拟硬件资源。客户操作系统运行在VMX非根操作模式下。
虚拟服务分发器在Smart-VM虚拟化层所处的位置如图5.4所示。
虚拟服务分发器会维护一种虚拟服务表,这张表的每个条目对应的是一个服务函数。当处理器从非根操作模式退出到根操作模式下的时候,都可以从这个虚拟服务表中找到相应的服务函数进行处理。从非根操作模式退出到根操作模式下的基本原因存放在Basic VM-Exit Information域。
第一代Intel-VT技术,在激活VMX模式的时候,需要将CR0.PE,CR0.NE, CR0.PG,CR4.VMXE设置为1,即开启VMX模式需要先开启保护模式和分页机制。
图 7.1 判断和设置进入VMX所需条件的流程图
图7.1显示了Smart-VM激活VMX模式的流程图:
a) 开启保护模式和虚拟内存机制:在加载程序的时候,已经开启了保护模式和分页机制。具体参看引导程序和加载程序部分;
b) 判断是否支持CPUID指令;
c) 判断该处理器是否有支持Intel-VT技术;
d) 开启VMX操作:
i. 激活VMX指令操作:置IA32_FEATURE_CONTROL.bit2为1;
ii. 锁定MSR寄存器:置IA32_FEATURE_CONTROL.bit0为1;
iii. 置CR0.NE,CR4.VME为1;
iv. 设置VMCS revision id;
v. 执行VMXON指令,激活VMX模式;
真实的机子在启动的时候,进入的是实模式,然后从实模式跳转到保护模式。虚拟机监控器也需要虚拟这个过程。但是当处理器进入VMX非根操作模式是,处理器只有虚拟8086模式和保护模式两种。因此,要虚拟实模式,一般采用以下两种方式:
a) 实现一个模拟实模式的模块;
b) 利用虚拟8086模式;
Smart-VM采用第二种方法来虚拟实模式。
利用虚拟8086模式来实现实模式的虚拟化同样也有两种方法:
a) 利用保护模式下的虚拟8086模式;
b) 利用VMX非根操作操作模式下的保护模式下的虚拟8086模式;
图7.2的着色部分显示了虚拟8086模式在处理器各个模式中所处的位置。如果利用保护模式下的虚拟86模式,那么需要进行保护模式和VMX模式之间的切换,因此,我们采用第二种方法,即使用VMX非根操作模式下的保护模式下的虚拟8086模式。
图 7.2 虚拟8086模式
虚拟8086模式在保护模式下是运行在特权级3的,因此跟实模式还是有一些差别的:
1. 不能运行特权级指令;
2. 中断机制采用的是保护模式下的中断机制,而不是BIOS中断;
3. I/O操作,也需要遵循保护模式下的保护机制;
图 7.3 虚拟8086在保护模式下的切换
图7.3显示了虚拟8086在保护模式下的切换。
虚拟8086监控器实际上是作为Smart-VM虚拟化层的一个子模块,如图7.4所示。
图 7.4 Smart-VM虚拟8086监控器架构图
由图7.4可以看出,虚拟8086监控器模块既可以在VMX根操作模式下运作,也在VMX非根操作模式下运作:
a) 8086程序在非根操作模式下运行的时候,可能由于一些原因(比如说执行int指令)而退出到VMX非根操作模式下的虚拟8086监控器,此时的虚拟机监控器是在VMX非根操作模式下的特权级0下;
b) 虚拟8086监控器也可能由于一些原因(比如说I/O操作)而退出到VMX根操作模式;
在虚拟8086模式下虚拟实模式,需要处理好以下几个问题:
在VMCS的guest-state中的eflags的VM置1,即可进入非根操作模式下的虚拟8086模式。关于其他客户域的寄存器的设置,跟进入保护模式下的客户域的设置有所不同,请参看下面的表。
Smart-VM将所有的软件异常,都转交给Smart-VM虚拟机监控器,由它处理。
但是当虚拟机监控器处理完一个异常的时候,需要在进入非根模式的时候,插入事件说明,告诉处理器,虚拟机监控器处理完了一个异常。如果同一个客户操作系统,在产生一个异常之后,虚拟机监控器未处理完,又产生一个异常,那系统就会产生双重故障。
在虚拟8086模式下,由于是在特权级3下运行,因此执行特权级指令会产生异常。Smart-VM设置了相关的位,让处理器能够捕获客户操作系统的软件异常,并且转交给Smart-VM虚拟机监控器。
在实模式下,需要通过BIOS中断,才能够访问硬件,比如说读取硬盘或者软盘数据等。但是,在虚拟8086模式下,中断只能通过保护模式下的中断机制来实现。因此,我们在中断向量表上,需要根据BIOS的中断向量表实现一整套的BIOS中断。
当虚拟8086模式下的程序执行int指令的时候,就产生软件中断,转入虚拟8086监控器,由虚拟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]。
客户域
表 7.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 |
|
续表 7.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 |
|
续表 7.3 进入虚拟8086模式的客户域配置 |
|
Guest-state 非寄存器域 |
GUEST_PENDING_DBG_EXCEPTIONS = 0 |
VMCS_LINK_POINTER = 0xFFFFFFFF_FFFFFFFF |
宿主域
表 7.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的基址 |
|
续表 7.5 进入虚拟8086模式的宿主域配置 |
|
Host-state 寄存器域 |
IDTR的基址=Smart-VM虚拟机监控器IDT的基址 |
执行控制域
表 7.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 |
|
续表 7.7 进入虚拟8086模式的执行控制域 |
|
Processor-Based VM-Execution Controls |
|
PAUSE exiting = 0 |
|
Activate secondary controls = 0 |
|
EXCEPTION_BITMAP |
全部置为1 |
进入控制域
表 7.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 |
退出控制域
表 7.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 |
表 7.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的大小 |
Smart-VM虚拟机监控器采用的是第一代处理器虚拟化。
分配给客户操作系统的内存,是通过映射虚拟内存页表实现,然后将表传递给客户操作系统的CR3实现的。因此,客户操作系统所有关于CR3的操作,都要由Smart-VM虚拟机监控器处理。
本章介绍了Smart-VM虚拟化层的实现:
a) 虚拟服务分发器:客户操作系统对虚拟机监控器的请求,需要经过虚拟服务分发器,才能够到达相应的模块;
b) 激活VMX模式:先对处理器等进行了有效的验证,再进行相关的配置,最后启动VMX模式;
c) 处理器虚拟化的实现:实现了部分8086指令的虚拟化和80x86功能的部分虚拟化;
d) 内存虚拟化的实现:使用影子页表;