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

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
  某些处理函数没有给出,会在最后的源码中展示。
  来自网络的图片:

中国男篮为何亚洲杯不敌韩国?球迷一席话,道出个中缘由中国男篮为何亚洲杯不敌韩国?球迷一席话,道出个中缘由。网友热议一针见血地指出国家队输球了我们也难受,还是输韩国这支队伍,我们也不是无缘无故批评,也理解受特殊情况的影响,临时凑的阵容万亿比亚迪的下半场图片来源视觉中国文华夏能源网第一次,有中国企业距离世界第一车企铁王座这么近。6月10日,比亚迪市值突破1万亿元大关,超越大众晋身全球第三大车企,前面两家,一个是特斯拉,一个是丰田。雷霆杯大仙电竞梦得以圆满,继首秀豪取MVP后携四大长老再度出战相信王者荣耀的玩家们都知道,伴随着电子竞技行业的飞速发展,王者荣耀也是和其他热门游戏一样逐渐走向了职业化,拥有了一套成熟的赛事体系,出现了诸多与之相关的专业赛事,其中除了官方举办的3年3650万!被喊了三年半水货,榜眼终于找到家了都知道,NBA自由市场已经开启两周。截止到目前,绝大部分出色的自由球员都已经完成了签约,在众多的签约里,有这么一笔可能没那么受人关注,但绝对值得一提活塞以三年3650万续约了马文巴能怪齐达内吗?后罗纳尔多时代的最强前锋,他被低估了?为什么现在对亨利的评价都不高?因为齐达内粉丝在网络上的话语权太重,齐达内本人又很有存在感,导致部分球迷低估了亨利。评价不高?亨利在阿森纳虐菜,在国家队只能抱齐达内的大腿?我不服!事尼克斯和爵士开始讨论米切尔的交易TheAthletic记者ShamsCharania报道,爵士和尼克斯开始讨论关于多诺万米切尔的交易。爵士已经和多支球队开始了关于米切尔的交易谈判。多位消息人士透露,尼克斯是过去几现役总得分榜前十詹姆斯高居第一,威少第五,库里第九在上赛季之前,全联盟现役只有5位球员拿到了超过两万分,分别是詹姆斯安东尼杜兰特哈登威少,而上赛季,保罗阿尔德里奇和库里都先后达成了两万分的里程碑,再加上尚未正式宣布退役的乔约翰逊,每次洗头大把掉发?提醒平时远离这3物,或能让头发变好导语相信每个人都想拥有一头乌黑亮丽的秀发,不仅可以提升自身形象,也能让自己变得更加自信。然而现实总是那么不尽人意,随着生活节奏的加快,人们的压力变得越来越大,所以有很多年轻人都受到NothingPhone(1)有着酷炫的透明后背和灯效,但其它地方只是部中端手机在多次曝光和预热后,前一加创始人CralPei做的新手机NothingPhone(1)终于正式发布了,此前大家都已经见识过它那个独有的透明后背设计,加上名为Glyph界面的灯光系统网球天后李娜被曝结婚后未见公婆,夫妻相处之道让人吃惊,太沉默曾经的网球运动被认为是欧美选手之间的竞争,但是在中国有一位选手的出现彻底改变了这一局面。她凭借超强的实力夺得2011年法网和2014年澳网的冠军,在职业生涯也2次捧起大满贯赛事的冠都37岁了,刚刚结婚不久的哈达迪,就要来打亚洲杯!他也很无奈啊1985年5月19日出生的哈达迪,已经37岁了。但是,今年亚洲杯的比赛,他依然是伊朗男篮的首发中锋。他真的是亚洲杯的老熟人了,3次亚洲杯冠军,4次亚洲杯MVP,第8次参赛,难以置信
入冬必吃这6样比较适合养生,建议收藏1山药(每100克含量)热量(大卡)57。00,碳水化合物(克)12。40,脂肪(克)0。20,蛋白质(克)1。90,纤维素(克)0。802红薯(每100克含量)热量(大卡)86。谁是冬日钙王冬天的菜市场上,萝卜是永远的主角。虽然我们经常吃萝卜,但很少有人会吃萝卜缨(萝卜叶),其实,萝卜缨的营养价值丝毫不比萝卜差!冬日钙王在营养学届,一般钙含量在100毫克100克以上的马云能不能把休斯敦火箭队收购了目前火箭队遭遇了12连败,在11连败赛后老板召集了塞拉斯和斯通开紧急会议,对球队现状相当不满意,但结果看来,一切徒劳无用的一次会议,两个人可能没有领会老板的意图,可能老板看到惨淡的NBA14场13负!休斯敦火箭12连败!火箭102136灰熊!榜眼格林15分北京时间11月16日消息,孟菲斯灰熊队参加NBA常规赛,孟菲斯灰熊队与休斯敦火箭队交锋,NBA榜眼格林得到15分。全场比赛结束,孟菲斯灰熊队136102大胜休斯敦火箭队,火箭102周梅森这可能是我最后一部反腐作品周梅森。周梅森怎么也没有想到,他最想写的故事遭到了从业以来最密集的攻击。一些人有目的地在网络上带节奏,这是行业生态出现了问题。每一个创作者都不愿接受自己的作品被人恶意抹黑。周梅森说半导体巨头坂本幸雄被美韩逼到绝路,72岁投奔中国寻机复仇如今芯片在各行各业的运用已经十分广泛,无论是商用民用军工等都离不开芯片的支撑。而韩美则掌握了芯片领域的半壁江山,韩美国之所以能称霸芯片领域主要得益于他们的半导体公司,像三星电子英特辞职炒股第606天北交所今日开市,新股涨声一片,我却意外躺枪,不,应该是躺炮,被榴弹炮炸了。所持个股开盘直接跌到9个点,这还有道理可讲吗?该断则断,除了T进去的筹码,我果断斩掉了被炸残的双腿,拖着血少管,少说,少想,就是福有时候,我们之所以活得不开心,活得累,是因为对别人的事情操心太多,总拿别人的事当作自己的事。殊不知,管闲事的后果,未必被他人承情和感激,反而会遭人厌恶,管错了,就惹祸上身,到头来只人老了,不在于运动,不在于喝水,请重视这3条准则常言道人生七十古来稀。这话读起来看似简单,却是圣人的自我修养,能做到的其实寥寥无几。仔细研究这段话,人生最难的到底是哪个阶段?有人认为是上有老下有小的壮年时,也就是40不惑时,但我牺牲7位英雄,灭掉7000鬼子!而人们却忘了这抗日第一场大捷01hr前些时电视荧屏流行抗战剧,我们喜闻乐见的是杀鬼子。可是一些抗日神剧中轻易消灭大量日寇的离奇情节,又让人感到不靠谱,意犹未尽。今天要给大家讲一个中国军队以极少牺牲,歼灭上千日周总理问警卫员你们师政委在哪?警卫员我就是,后成开国将军导读从1935年4月到10月,红二六军团湘鄂川黔一带,先后打败国民党的数次围剿,歼敌2万多人,部队人数从最初的1万人扩张到2万多人,并创建了湘鄂川黔革命根据地。1935年11月,为