Intel处理器虚拟化技术浅析2VMCS初始化
VMCS区域:guest 区域,从真实系统进入虚拟系统时,CPU需要加载的数据,包括很多CPU内部的 寄存器,通用寄存器,控制寄存器,调试寄存器之类。host区域,就是从虚拟系统返回真实系统时CPU需要加载的寄存器。控制区域进入虚拟系统后,处理器的行为由这个区域的字段控制。虚拟机退出时的控制区域。控制怎样进入虚拟机。控制CPU以什么样的方式退出到真实系统。从虚拟机退出到真实系统时,虚拟系统退出的原因,或者失败时的错误代码。
上一节提过VMCS区域需要专门的汇编指令才能读取,下面我们填充VMCS区域。
我们看下64位系统段选择子的描述:_SEGMENT_SELECTOR record Limit:32, SEGMENT_GPA:4,SEGMENT_attr_G:1,SEGMENT_attr_D_B:1,SEGMENT_attr_L:1, SEGMENT_attr_AVL:1,SEGMENT_attr_P:1, SEGMENT_attr_DPL:2,SEGMENT_attr_S:1,SEGMENT_attr_Type_code_or_data:1,SEGMENT_attr_Type_CRA:3,selector_index:13,selector_TI:1,selector_RPL:2
;selector_TI (Table Indicator)描述符表索引位,当TI=0时从GDT查找 =1时从LDT查找。RPL: 权限级别0-3
vmx_vmwrite_seg proc _value_HOST_XX_SELECTOR:qword,_SELECTOR_name:qword mov rax,_SELECTOR_name movzx eax,ax and eax,0f8h ;清低3位,RPL= 0 从GDT(全局描述符表)加载段描述符 cdqe mov rcx,_value_HOST_XX_SELECTOR vmwrite rcx, rax ret vmx_vmwrite_seg endp invoke vmx_vmwrite_seg,HOST_ES_SELECTOR,ES invoke vmx_vmwrite_seg,HOST_CS_SELECTOR,CS invoke vmx_vmwrite_seg,HOST_SS_SELECTOR,SS invoke vmx_vmwrite_seg,HOST_DS_SELECTOR,DS invoke vmx_vmwrite_seg,HOST_FS_SELECTOR,FS invoke vmx_vmwrite_seg,HOST_GS_SELECTOR,GS
任务寄存器需要单独操作:str rax invoke vmx_vmwrite_seg,HOST_TR_SELECTOR,RAX mov rcx,MSR_IA32_EFER
使能Extended Feature Enable Register;rdmsr shl rdx, 20h or rax, rdx mov rbx,rax invoke vmx_vmwrite,HOST_EFER,rbx
cr0 与cr4的固定位:
MSR_IA32_VMX_CR0_FIXED0、MSR_IA32_VMX_CR0_FIXED1 字段里规定了guest里cr0控制寄存器的数值要求。mov rcx,MSR_IA32_VMX_CR0_FIXED1 rdmsr shl rdx, 20h or rax, rdx mov rbx,cr0 and rbx,rax mov rcx,MSR_IA32_VMX_CR0_FIXED0 rdmsr shl rdx, 20h or rax, rdx or rbx,rax vmwrite,HOST_CR0, rbx vmwrite,HOST_CR3, cr3 mov rcx,MSR_IA32_VMX_CR4_FIXED1 rdmsr shl rdx, 20h or rax, rdx mov rbx,cr4 and rbx,rax mov rcx,MSR_IA32_VMX_CR4_FIXED0 rdmsr shl rdx, 20h or rax, rdx or rbx,rax vmwrite,HOST_CR3, rbx
从全局描述符表查找任务寄存器的基址:sgdt @gdtbase lea rdi,@gdtbase mov rbx,[rdi+2];路过Limit str rdx;tss invoke GetSegmentDescriptor,addr @_SEGMENT_SELECTOR,rdx,rbx vmwrite,HOST_TR_BASE, @_SEGMENT_SELECTOR.BASE
填充fs寄存器字段:(64位系统下fs基本是兼容32个应用程序而保留)mov ecx, MSR_FS_BASE rdmsr shl rdx, 20h or rax, rdx vmwrite,HOST_FS_BASE,rax
填充gs寄存器字段:(64位系统非常重要的寄存器,相当于32个系统里的fs寄存器)mov ecx, MSR_GS_BASE rdmsr shl rdx, 20h or rax, rdx vmwrite,HOST_GS_BASE, rax
填充全局描述符表字段:sgdt @gdtbase lea rdi,@gdtbase mov rbx,[rdi+2] vmwrite,HOST_GDTR_BASE,rbx
填充中断描述符表字段:sidt @idtbase lea rdi,@idtbase mov rbx,[rdi+2] vmwrite,HOST_IDTR_BASE,rbx vmwrite,VMCS_LINK_POINTER,-1;不启用SMM双重监控处理机制 vmwrite,EXCEPTION_BITMAP,0
填充guest 段选择子、段限、访问权限、段基址。sgdt tbyte ptr @gdtbase lea rdi,@gdtbase mov rbx,[rdi+2] invoke FillGuestSelectorData,rbx,0,es invoke FillGuestSelectorData,rbx,1,cs invoke FillGuestSelectorData,rbx,2,ss invoke FillGuestSelectorData,rbx,3,ds invoke FillGuestSelectorData,rbx,4,fs invoke FillGuestSelectorData,rbx,5,gs sldt rax invoke FillGuestSelectorData,rbx,6,rax str rax invoke FillGuestSelectorData,rbx,7,rax
填充fs寄存器字段:mov ecx, MSR_FS_BASE rdmsr shl rdx, 20h or rax, rdx vmwrite,GUEST_FS_BASE,rax
填充gs寄存器字段:mov ecx, MSR_GS_BASE rdmsr shl rdx, 20h or rax, rdx vmwrite,GUEST_GS_BASE,rax
填充控制字段:mov ecx, MSR_IA32_VMX_TRUE_PROCBASED_CTLS Rdmsr ;eax存入的是允许为零的位 "允许为零的位"已经被标0(其余的位必须为1)edx存入的是允 许为1的位"允许为1的位"已经被标1(其余的位必须为0) Mov ecx,CPU_BASED_ACTIVATE_MSR_BITMAP+ CPU_BASED_ACTIVATE_SECONDARY_CONTROLS mov rbx,rcx or ecx,eax and ecx,edx vmwrite,CPU_BASED_VM_EXEC_CONTROL,rcx mov ecx, MSR_IA32_VMX_PROCBASED_CTLS2 rdmsr mov rcx,CPU_BASED_CTL2_RDTSCP ; RDTSCP这个指令的用途,它是RDTSC的升级版,在一些比较新的处理器中用于获 ;得CPU时间计数器。 ;SECONDARY_EXEC_ENABLE_RDTSCP | SECONDARY_EXEC_ENABLE_INVPCID | ;SECONDARY_EXEC_XSAVES; ;如果不设置 rdtsc exiting 和 use tsc offsetting 的话,那么 rdtscp 会正常执行,因此这 ;里其实可以只设置 SECONDARY_EXEC_ENABLE_RDTSCP ,其他不设置。 ;这样的话 rdtscp 指令的执行并不会导致vm-exit事件的发生。这里我尝试了只将 ;SECONDARY_EXEC_ENABLE_RDTSCP 控制位置位,其他位不动,发现完全不会进入到 ;vm-exit事件中。 ;因此如果图省事的话其实可以只将 SECONDARY_EXEC_ENABLE_RDTSCP 置位,其他位不 ;进行操作即可。 or rcx,CPU_BASED_CTL2_ENABLE_INVPCID ;如果 invlpg exiting 没有被设置,那么也不会导致vm-exit事件的发生。因此这里其实 ;也可以只设置 SECONDARY_EXEC_ENABLE_INVPCID ,不设置 invlpg exiting 。这样可以 ;让其正常执行,不用在vm-exit处理函数中对其进行复杂的处理。 or rcx,CPU_BASED_CTL2_ENABLE_XSAVE_XRSTORS or rcx,CPU_BASED_CTL2_ENABLE_EPT or rcx,CPU_BASED_CTL2_ENABLE_VPID mov rbx,rcx or ecx,eax and ecx,edx and ebx,edx or ebx,eax vmwrite,SECONDARY_VM_EXEC_CONTROL,rcx vmwrite,PIN_BASED_VM_EXEC_CONTROL,0 mov ecx, MSR_IA32_VMX_TRUE_EXIT_CTLS Rdmsr mov rcx,VM_EXIT_IA32E_MODE + VM_EXIT_ACK_INTR_ON_EXIT ;On processors that support Intel 64 architecture, this control determines whether a logical ;processor is in 64-bit mode after the next VM exit. Its value is loaded into CS.L, and ecx,edx or ecx,eax vmwrite,VM_EXIT_CONTROLS,rcx mov ecx, MSR_IA32_VMX_TRUE_EXIT_CTLS rdmsr mov rcx,VM_EXIT_IA32E_MODE + VM_EXIT_ACK_INTR_ON_EXIT ;On processors that ;support Intel 64 architecture, this control determines whether a logical ;processor is in 64-bit mode after the next VM exit. Its value is loaded into CS.L, and ecx,edx or ecx,eax vmwrite,VM_EXIT_CONTROLS,rcx
;. 配置vm-entry控制域mov ecx, MSR_IA32_VMX_TRUE_ENTRY_CTLS rdmsr mov rcx,VM_ENTRY_IA32E_MODE ;64系统必须填, 参考【处理器虚拟化技术】(第212页) and ecx,edx or ecx,eax vmwrite,VM_ENTRY_CONTROLS,rcx ;
以下为填充guest区域和填充host区域基本相同mov rcx,MSR_IA32_EFER rdmsr shl rdx, 20h or rax, rdx mov rbx,rax vmwrite,GUEST_EFER,rbx mov rcx,MSR_IA32_VMX_CR0_FIXED1 rdmsr shl rdx, 20h or rax, rdx mov rbx,cr0 and rbx,rax mov rcx,MSR_IA32_VMX_CR0_FIXED0 rdmsr shl rdx, 20h or rax, rdx or rbx,rax vmwrite,GUEST_CR0,rbx mov rcx,MSR_IA32_VMX_CR4_FIXED1 rdmsr shl rdx, 20h or rax, rdx mov rbx,cr4 and rbx,rax mov rcx,MSR_IA32_VMX_CR4_FIXED0 rdmsr shl rdx, 20h or rax, rdx or rbx,rax vmwrite,GUEST_CR4,rbx vmwrite,GUEST_CR3,cr3 invoke vmx_vmwrite,GUEST_DR7, 0400h sgdt @gdtbase lea rdi,@gdtbase mov rbx,[rdi+2] vmwrite,GUEST_GDTR_BASE,rbx;Get_GDT_Base()); movzx eax, word ptr [rdi] vmwrite,GUEST_GDTR_LIMIT, rax;Get_GDT_Limit()); sidt @idtbase lea rdi,@idtbase mov rbx,[rdi+2] vmwrite,GUEST_IDTR_BASE,rbx;Get_IDT_Base()); movzx eax,word ptr [rdi] vmwrite,GUEST_IDTR_LIMIT,rax; Get_IDT_Limit()); pushfq pop rax vmwrite,GUEST_RFLAGS, rax; mov rsi,_current_vmState mov rdx,[rsi+VirtualMachineState.MSRBitMapPhysical] vmwrite,MSR_BITMAP, rdx;vmState->MSRBitMapPhysical);MSR Bitmap的某位为0时访问 ;该位所对应的MSR不会产生VM-exit vmwrite,GUEST_RSP, _GuestStack;(ULONG64)GuestStack); //setup guest sp mov rax,[rsi+VirtualMachineState.VmxGuestRip] vmwrite,GUEST_RIP, rax;addr VMXRestoreState; //setup guest ip mov rsi,_current_vmState mov rdx,[rsi+VirtualMachineState.VMM_Stack] mov rax,VMM_STACK_SIZE; add rdx,4000h;;堆栈向下增长,所以要增加,空间是0-VMM_STACK_SIZE 所以 要减1 vmwrite,HOST_RSP, rdx;((ULONG64)vmState->VMM_Stack + VMM_STACK_SIZE - 1)); ;host的rsp必须使用自己申请的一块内存。如果还是使用guest退出时的rsp,一定会 ;导致guest中堆栈被破坏从而导致不可预知的结果 lea rax,VMExitHandler vmwrite,HOST_RIP, rax;addr VMExitHandler
某些处理函数没有给出,会在最后的源码中展示。
来自网络的图片:
发挥资源优势发展乡村旅游来源人民日报葡萄牙新城堡村的历史古迹。联合国世界旅游组织供图在摩洛哥艾尔霍巴特村,当地妇女艾莎正在头巾上刺绣。纳吉姆卡利勒摄墨西哥奇瓦瓦州克雷尔镇居民制作的手工艺品。联合国世界旅游
红星耀齐鲁东阿巧用党建绘就乡村旅游新画卷走好乡村旅游之路,党建引领是根本。近年来,东阿县牛角店镇以党建引领乡村振兴,秉持农业是根文化是魂旅游是路的理念,积极探索党建乡村旅游模式,统筹农业文化旅游产业发展,促进农文旅互动互
旅游业招工需求居各职业之首,酒店民宿求职人数涨近7成南都记者日前从多个招聘平台获悉,伴随旅游出行市场进入持续复苏态势,旅游业招工需求量增大,促进相应岗位招聘需求激增。例如,智联招聘数据显示,春节后第一周,客货运司机乘务招聘职位数同比
高荡村民族风情重绽乡村旅游升温来源安顺日报掌上安顺村子里又热闹起来了,客人回来了,村里老百姓的精气神儿都跟以前不一样了,大家摩拳擦掌,都准备大干一场。看着人头攒动的文化广场,镇宁自治县高荡村村支书伍承松开心地说
春节结束了,为什么多景区依旧爆满?兔年旅游消费呈现长尾效应尽管春节假期早已结束,但是旅游消费仍在升温。记者采访获悉,受到民俗活动丰富学生还在放假多重政策利好等因素影响,市民的消费需求得到稳步释放,人们的旅游热情得到空前释放。可以说,旅游出
让手机应用软件更清爽人民时评近年来,应用软件产业发展迅猛,为广大消费者提供了丰富多彩的互联网应用,便利了人民群众的生产生活。与此同时,预置应用软件过多且无法卸载等新情况,也令人不胜其烦。查看一下手机等移动智能
今天涨了,明天接着涨吗?今天A股缩量回调沪市上涨收出小阳线,两市成交量只有8457亿,但是个股方面3379家上涨,1504家下跌,回血效应明显。昨天热门的ChatGPT出现分化,但是人工智能和新能源热度不
新一轮芯片战来了?阿里野心暴露,外媒ARM惹众怒自从老美修改了芯片市场规则后,全球芯片行业就迎来了大洗牌,华为等中企被打压的同时,美企也出现了内讧。近日,芯片行业又传出老美将会进一步打压华为的消息,不出意外的话,新一轮的芯片战要
注意缩小战线一连板高标汉王科技7板中航电测4板华锋股份捷荣技术东港股份天娱数科3板2板4只二进攻主线开盘没什么超预期的地方按照昨天人工智能的强度汉王科技今天的单子是低于预期的,川大智胜昨天的反
彭继先睿鹰制药诞生于菏泽发展于菏泽,理应承担起发展的责任鲁网2月8日讯(记者靳昕)在菏泽市委市政府举行的菏泽市企业家队伍建设暨菏泽市杰出企业家颁奖大会上,山东睿鹰制药集团首席科学家总裁彭继先被授予杰出企业家称号并记个人二等功一次。近日,
北交所蓄力向上突破兔年开市,北京证券交易所北证50指数最高涨幅超7,日成交额连续站上20亿元大关,新上市的多只新股均实现了开门红。但也要看到,行情缺乏持续性交易量还不稳定等问题依然存在,北交所改革发