范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Intel虚拟化技术浅析

  本文仅讲解基于处理器的虚拟化,至于其它的PCI总线设备虚拟化以及基于网络的虚拟化不在我们的学习范围内。我们仅仅学习一下怎样虚拟一个运行环境,然后监控软件的运行。
  假设我们64位的win10系统里有个你很在意的软件在运行(它可能是应用程序也可能是驱动程序,你怀疑它是个不友好的软件,你想删除它,你删不了,你想终止它,你终止不了。我们假设它很健壮不会自己产生异常导致自动退出。那么我们就可以通过虚拟化技术直接修改它的执行内存让它自动退出,或者让它去执行别的代码,即便它有所谓的内存保护也没用(仅针对应用程序)!
  我们需要编写一个驱动程序才能实现虚拟化技术,应用程序权限太低了,vmlaunch这样的特权指令它运行不了。我们编写的驱动程序就叫做VMM(Virtual Machine Monitor) 虚拟机监管者,VMM准备一个运行环境,让需要监管的程序在里面运行就可以了。VMM准备的这个运行环境我们就叫做VMX(Virtual Machine Extensions)。我们用guest 代表需要监管的程序。
  VMXON 区域: VMM需要一个物理地址区域去记录和维护一些工作,这个区域对我们来说是不透明的,但是准备运行环境时却是必须的。
  VMCS 区域:为guest运行环境准备的物理地址区域,这个区域对我们来说是不透明的,并且需要用专用的指令vmwrite 去写入数据。(虽然你知道它的物理地址但是INTEL却不让你用mov指令去读写,你说气人不?)
  VMXON 区域、 VMCS 区域的大小通过MSR寄存器获取:mov rcx,MSR_IA32_VMX_BASIC rdmsr shl rdx, 20h or rax, rdx
  Rax 的值对应的数据如下:
  IA32_VMX_BASIC_MSR record VMX_BASIC_MSR_Reserved3:8,VMX_BASIC_MSR_VmxCapabilityHint:1,VMX_BASIC_MSR_VmExitReport:1,VMX_BASIC_MSR_MemoryType:4,VMX_BASIC_MSR_SupportedDualMoniter:1,
  VMX_BASIC_MSR_SupportedIA64:1,VMX_BASIC_MSR_Reserved2:3,VMX_BASIC_MSR_RegionClear:1,
  VMX_BASIC_MSR_RegionSize:12,VMX_BASIC_MSR_Reserved1:1,VMX_BASIC_MSR_RevisionIdentifier:31
  VMX_BASIC_MSR_RegionSize:12 代表VMXON或VMCS区域大小 12位数据 最大也就4K字节,事实上也就是4K大小,但是INTEL有个要求那就是我们申请的物理内存必须是4K边界对齐的。所以我们申请个8K的空间然后再4K对齐就OK了。
  VMXON 区域 和VMCS 区域 虽然说是不透明的,但是INTEL却要求我们必须把前4个字节给填充为用MSR_IA32_VMX_BASIC 参数 调用rdmsr 获取的数据
  我们分配个连续内存:invoke MmAllocateContiguousMemory,VMCS_SIZE*2+ALIGNMENT_PAGE_SIZE,-1mov @Contiguous_buffer,rax
  再转换成物理内存:invoke MmGetPhysicalAddress,@Contiguous_buffer mov @PhysicalBuffer,rax
  再来个4K对齐:mov rax,@PhysicalBuffer lea rax,[rax+ALIGNMENT_PAGE_SIZE-1] mov rcx,ALIGNMENT_PAGE_SIZE-1 not rcx and rax,rcx mov @alignedPhysicalBuffer_vmxon,rax  mov rax,@Contiguous_buffer lea rax,[rax+ALIGNMENT_PAGE_SIZE-1] mov rcx,ALIGNMENT_PAGE_SIZE-1 not rcx and rax,rcx mov @alignedVirtualBuffer,rax
  把MSR_IA32_VMX_BASIC 数据存入前4个字节:mov rcx,MSR_IA32_VMX_BASIC rdmsr
  ;MSR的高32位内容存放在EDX寄存器中,
  ;MSR的低32位内容存放在EAX寄存器中(在支持intel64架构的处理器中RDX和RAX的高32位忽略)。如果MSR中没有64位(有些位没有实现),则EDX:EAX中没有实现的位置则未定义。shl rdx, 20h or rax, rdx mov @IA32_VMX_BASIC_MSR.All,rax mov rcx,@alignedVirtualBuffer mov [rcx],eax
  至此我们就可以调用vmxon 指令了(告诉CPU我们准备进入虚拟机模式了):Vmxon @alignedPhysicalBuffer_vmxon
  同样的方法我们初始化VMCS 区域,然后调用vmptrld(告诉CPU我已经把你需要的VMCS 区域申请好了,你现在可以加载了。)vmclear qword ptr @alignedPhysicalBuffer_vmcs Vmptrld qword ptr @alignedPhysicalBuffer_vmcs
  指令:Vmlaunch ;进入虚拟机吧!!!!
  当然前提是我们必须把VMCS 区域按INTEL的要求给填充完整才可以。
  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
  某些处理函数没有给出,会在最后的源码中展示。
  来自网络的图片:

书虫双语听读4级下极限之旅0302前情提要1949年娜奥米。鲍尔出生在新西兰的一家农场里,她很喜欢书中的冒险故事,1970年12月31日娜奥米和朱丽叶动身前往欧洲,娜奥米腼腆又缺乏自信,她一直不知道自己真正想做的是蒙古草原出现30只狼,咬伤蒙古獒,咬死200只羊,戈壁熊跑来抢食天苍苍,野茫茫,风吹草低见牛羊这是一首出自南北朝时期的民歌,描写了蒙古草原的壮丽风光。蒙古草原东至大兴安岭,西至西萨彦岭,北抵贝加尔湖,南到阴山和燕山山脉。东部因为大兴安岭的滋润,淄博桓台县马踏湖的苇秋淄博桓台县马踏湖,当地人习惯用秋代指一年中的不同收获季节,麦收称为麦秋,秋收称为大秋,而收割芦苇,便被称为苇秋。苇秋从立冬开始,一直持续到春节前后。马踏湖15000亩芦苇荡,浩瀚缥中兴通讯助力河北移动顺利完成5G新通话试点首呼近日,中兴通讯助力河北移动顺利完成了完全基于5G新通话网络架构的首呼,充分展现了中兴通讯在5G新通话领域的核心竞争力,为下一步的试点及试商用奠定了坚实的基础。致力于成为世界一流信息iPhone13及以下的停在iOS15。7吧13pm,系统iOS15。7。1,先上视频视频加载中曾经的手痒,爱思即使不能认证刷机也通过OTA升级了iOS15。7。1,咖喱味十足!流畅度和续航没提升到,反而一身bug,有些功能2022年下半年3款值得买的手机,高端商务旗舰,成功人士不二之选每年双十一之前,各手机品牌都会陆续推出旗舰款机型,相比上半年的小试牛刀,下半年往往才是真正的高端商务旗舰。今天就给大家推荐3款值得买的手机,拿在手里,立马摇身一变让你像个成功人士华与中企脱钩损失惨重,美芯片巨头扛不住了,开始无视禁令几十年前,老美为了更好地利用他国廉价的劳动力和丰富的资源,极力地推动全球化,让各国企业形成了一个整体。全球化的好处显而易见的,如芯片,如果不是集中了全人类的智慧,根本造不出来,人类北京多个公共场所关闭,涉婚姻登记中心公园景区商场受疫情影响北京多个景区博物馆等公共场所已暂时关闭今天小编汇总了一下快拿小本本记好啦近日本市疫情处于发展阶段大家出行要提前确认行程别跑空北京多个部门暂停部分服务朝阳区人民检察院暂停来非复旧园(徐汇桂林公园)非复旧园桂林公园上海区域内除了五处明清古园外,还有一些民国遗存的旧园,漕河泾畔桂林公园的前身是沪上大亨黄金荣的私家花园,始建于1931年,那时黄金荣年过六旬,从法租界巡捕房督查长的超1200只黑颈鹤舞动云南大山包湿地来源人民网云南频道黑颈鹤信步大山包湿地。吴太平摄云贵高原是黑颈鹤主要越冬地。吴太平摄鹤舞高原,犹如水墨画。吴太平摄越冬黑颈鹤信步大山包湿地。吴太平摄越冬黑颈鹤信步大山包湿地。吴太平缅甸独特的街头现象,中国游客看了会脸红,表示无法接受时代在发展,国与国之间的交流也越来越密切,随着人们物质条件的提升。(此处已添加小程序,请到今日头条客户端查看)很多人都想走出国门去看一看,享受生活现在成为了很多人的追求。对于我国而
德赫亚,危机我的表现太差了,这是糟糕的一天。这是德赫亚当时的检讨,相比于安慰和同情的声音,落井下石的不在少数,毕竟他在曼联坐拥着37。5万英镑的周薪,一次黄油手就容易推翻德赫亚之前苦心经营的印重塑新汽车新产业,长安如何智胜下半场?历史的车轮滚滚向前,唯有不断追逐未来,才能不被时代淘汰。如果说新能源加速渗透是产业竞争的上半场,那么智能化技术的突破则将成为竞争的下半场,智能化必将重塑新汽车和新产业。8月29日,易经智慧穿衣打扮的六重境界,你在哪一重?一个人的穿衣打扮,并不是简简单单的驱寒蔽体,遮羞藏肉。而是你怎么穿,怎么打扮都从侧面折射出你的品味气质和人品。穿衣打扮是一张最明显的向外界传达你是谁的形象名片,每时每刻都在影响着别作为做过泪沟填充面部提升的过来人,我来说说几点真实感受爱美是女人一生的追求,每个女人都希望自己年轻漂亮,虽然我已经四十多岁了,但也不例外。自从我做了泪沟填充面部提升之后,身边很多人说我像做了拉皮一样,整个人变年轻许多。作为做过泪沟填充浪漫治愈的句子文案你是我的,半截的诗,不允许别人更改一个字。你是我绕过山河错落,才找到的人间烟火。当我跨过沉沦的一切,向着永恒开战的时候,你就是我的军旗。无论何人,无论何时,人们总要在乌云周围寻索着一个人,将来会发财的征兆作者壹号情感原创作品,抄袭必究现实生活中,每个人都渴望变得有钱,渴望自己可以成功发财,但生活不是靠幻想出来的,没有努力就不会产生好的结果。当然了,努力也需要讲究一定的方向,要想改变母亲走了,昨日安葬吃着饭,心里忽然一紧坏了,母亲怎么吃饭?怎么把母亲给忘了?闪念过后,忽而清醒,我此生此世最亲的母亲已经离我而去!离世前近四十天母亲吃不下饭,只喝一点米汤。持续发烧近两个月的母亲,饿50句九月的文案1愿九月开始的日子清净,抬头遇见都是柔情。2八月的风偷恋花的香气,九月的你又住进谁的心。3没有不可治愈的伤痛,没有不能结束的沉沦。所有失去的,都会在丰收的九月以另一种方式归来。4当文案看一眼就值得收藏的文案语录我往时间里看一眼只能看见你当我看你一眼便看见整片后来时间。落日余晖的路上总是爱意弥漫别让世俗淹没生活的浪漫和热情。我对于你,如鲸向海似鸟投林,退无可退,无可避免。樱花在风的诗里,春隐入尘烟有感两个苦难的人儿,也会结出甜蜜的果。没有粮,可以种地,你在前面走,我在后面种,像不像把你的脚印种在了地里?没有鸡蛋,可以先借蛋孵鸡。孵鸡的过程似乎也很浪漫!灯光闪闪,希望漫漫!鸡下的母亲去世三周年祭徐庆举不久前,我和妻子去了华山,然后转道西安。妻子第一次到西安,兵马俑是必须去看的。因兵马俑我已参观多次,便没有再花那份钱,只让妻子一个人去参观了。在等候她的时段,我在挨着景区的秦