操作步骤

1检查主板是否支持vt-d

  1. 检查主板是否能够支持vt-d虚拟化技术
    1.1通过cpuid


    1.2判断cr0 cr4

    1.3 msr 3ah地址读取bit 0

    1.4 分配一个4k的物理地址给vmxon参数开启vmx。vmx前32位地址需要写入版本号不然报错
vmcs virtual machine control structures


在vmlaunch之前需要配置guest的信息。每一个guest都需要分配4k的空间。

2 vmxon && Vmx_VmClear

Vmx_VmxOn(g_VMXCPU.pVMXONRegion_PA.LowPart, g_VMXCPU.pVMXONRegion_PA.HighPart);
调用指令vmxon 分配一个4k的真实物理地址给vmxon运行空间

Vmx_VmClear(g_VMXCPU.pVMCSRegion_PA.LowPart, g_VMXCPU.pVMCSRegion_PA.HighPart);
vmclear 清空运行域空间初始化version.

Vmx_VmPtrld(g_VMXCPU.pVMCSRegion_PA.LowPart, g_VMXCPU.pVMCSRegion_PA.HighPart);

调用vmptrld相当于装载过程
列出汇编:

Vmx_VmPtrld Proc LowPart:dword,HighPart:dwordpush HighPartpush LowPartvmptrld qword ptr [esp]add esp,8ret
Vmx_VmPtrld endp
3 配置vmcs
  1. guest state ares
    Vmx_VmWrite(GUEST_RSP, ((ULONG)g_VMXCPU.pStack) + 0x1000); //Guest 临时栈
    Vmx_VmWrite(GUEST_RIP, (ULONG)GuestEntry); // 客户机的入口点

    Vmx_VmWrite(VMCS_LINK_POINTER, 0xffffffff);
    Vmx_VmWrite(VMCS_LINK_POINTER_HIGH, 0xffffffff);

  2. host state ares
    Vmx_VmWrite(HOST_RSP, ((ULONG)g_VMXCPU.pStack) + 0x2000); //Host 临时栈
    Vmx_VmWrite(HOST_RIP, (ULONG)VMMEntryPoint); //这里定义我们的VMM处理程序入口

  3. 虚拟机运行控制域
    Vmx_VmWrite(PIN_BASED_VM_EXEC_CONTROL, VmxAdjustControls(0, MSR_IA32_VMX_PINBASED_CTLS));
    Vmx_VmWrite(CPU_BASED_VM_EXEC_CONTROL, VmxAdjustControls(0, MSR_IA32_VMX_PROCBASED_CTLS));

  4. VMEntry运行控制域
    Vmx_VmWrite(VM_ENTRY_CONTROLS, VmxAdjustControls(0, MSR_IA32_VMX_ENTRY_CTLS));

  5. VMexit运行控制域
    Vmx_VmWrite(VM_EXIT_CONTROLS, VmxAdjustControls(0, MSR_IA32_VMX_EXIT_

4

Vmx_VmLaunch();

对应的汇编指令方便理解
.686p
.model flat, stdcall
option casemap:none.data.codeAsm_CPUID  Proc    uses ebx esi edi fn:dword, ret_eax:dword, ret_ebx:dword, ret_ecx:dword, ret_edx:dwordmov    eax, fncpuidmov esi, ret_eaxmov dword ptr [esi], eaxmov esi, ret_ebxmov dword ptr [esi], ebxmov esi, ret_ecxmov dword ptr [esi], ecxmov esi, ret_edxmov dword ptr [esi], edxret
Asm_CPUID   EndpAsm_ReadMsr     Proc    Index:dwordmov  ecx,Indexrdmsrret
Asm_ReadMsr     EndpAsm_WriteMsr    Proc    Index:dword,LowPart,HighPartmov ecx, Indexmov   eax, LowPartmov edx, HighPartwrmsrret
Asm_WriteMsr    EndpAsm_Invd Procinvdret
Asm_Invd EndpAsm_GetCs PROCmov      eax, csret
Asm_GetCs ENDPAsm_GetDs PROCmov     eax, dsret
Asm_GetDs ENDPAsm_GetEs PROCmov     eax, esret
Asm_GetEs ENDPAsm_GetSs PROCmov     eax, ssret
Asm_GetSs ENDPAsm_GetFs PROCmov     eax, fsret
Asm_GetFs ENDPAsm_GetGs PROCmov     eax, gsret
Asm_GetGs ENDPAsm_GetCr0        Procmov     eax, cr0ret
Asm_GetCr0      EndpAsm_GetCr3      Procmov     eax, cr3ret
Asm_GetCr3      EndpAsm_GetCr4      Procmov     eax, cr4ret
Asm_GetCr4      EndpAsm_SetCr0      Proc    NewCr0:dwordmov     eax, NewCr0mov  cr0, eaxret
Asm_SetCr0      EndpAsm_SetCr2      Proc    NewCr2:dwordmov     eax, NewCr2mov  cr2, eaxret
Asm_SetCr2      EndpAsm_SetCr3      Proc    NewCr3:dwordmov     eax, NewCr3mov  cr3, eaxret
Asm_SetCr3      EndpAsm_SetCr4      Proc    NewCr4:dwordmov     eax,NewCr4mov   cr4, eaxret
Asm_SetCr4      EndpAsm_GetDr0 PROCmov      eax, dr0ret
Asm_GetDr0 ENDPAsm_GetDr1 PROCmov       eax, dr1ret
Asm_GetDr1 ENDPAsm_GetDr2 PROCmov       eax, dr2ret
Asm_GetDr2 ENDPAsm_GetDr3 PROCmov       eax, dr3ret
Asm_GetDr3 ENDPAsm_GetDr6 PROCmov       eax, dr6ret
Asm_GetDr6 ENDPAsm_GetDr7 PROCmov       eax, dr7ret
Asm_GetDr7 ENDPAsm_SetDr0 PROCmov       dr0, ecxret
Asm_SetDr0 ENDPAsm_SetDr1 PROCmov       dr1, ecxret
Asm_SetDr1 ENDPAsm_SetDr2 PROCmov       dr2, ecxret
Asm_SetDr2 ENDPAsm_SetDr3 PROCmov       dr3, ecxret
Asm_SetDr3 ENDPAsm_SetDr6 PROC nNewDr6:DWORDmov eax,nNewDr6mov      dr6, eaxret
Asm_SetDr6 ENDPAsm_SetDr7 PROC  nNewDr7:DWORDmov eax,nNewDr7mov     dr7, eaxret
Asm_SetDr7 ENDPAsm_GetEflags PROCpushfdpop      eaxret
Asm_GetEflags ENDPAsm_GetIdtBase PROCLOCAL  idtr[10]:BYTEsidt   idtrmov     eax, dword PTR idtr[2]ret
Asm_GetIdtBase ENDPAsm_GetIdtLimit PROCLOCAL    idtr[10]:BYTEsidt   idtrmov     ax, WORD PTR idtr[0]ret
Asm_GetIdtLimit ENDPAsm_GetGdtBase PROCLOCAL    gdtr[10]:BYTEsgdt   gdtrmov     eax, dword PTR gdtr[2]ret
Asm_GetGdtBase ENDPAsm_GetGdtLimit PROCLOCAL    gdtr[10]:BYTEsgdt   gdtrmov     ax, WORD PTR gdtr[0]ret
Asm_GetGdtLimit ENDPAsm_GetLdtr PROCsldt    eaxret
Asm_GetLdtr ENDPAsm_GetTr PROCstr   eaxret
Asm_GetTr ENDPVmx_VmxOn Proc LowPart:dword,HighPart:dwordpush HighPartpush LowPartVmxon qword ptr [esp]add esp,8ret
Vmx_VmxOn EndpVmx_VmxOff ProcVmxoffret
Vmx_VmxOff EndpVmx_VmPtrld Proc LowPart:dword,HighPart:dwordpush HighPartpush LowPartvmptrld qword ptr [esp]add esp,8ret
Vmx_VmPtrld endpVmx_VmClear Proc LowPart:dword,HighPart:dwordpush HighPartpush LowPartvmclear qword ptr [esp]add esp,8ret
Vmx_VmClear endpVmx_VmRead Proc uses ecx Field:dwordmov eax,Fieldvmread ecx,eaxmov eax,ecxret
Vmx_VmRead endpVmx_VmWrite Proc uses ecx Field:dword,Value:dwordmov eax,Fieldmov ecx,Valuevmwrite eax,ecxret
Vmx_VmWrite endpVmx_VmCall Procvmcallret
Vmx_VmCall endpVmx_VmLaunch Procvmlaunchret
Vmx_VmLaunch endpVmx_VmResume Procvmresumeret
Vmx_VmResume endpEND

非常感谢原作者分享:https://www.bilibili.com/video/BV1q4411P7LK?p=4&spm_id_from=pageDriver

vt-d 基本操作流程相关推荐

  1. vmware workstation 安装esx 启动vt功能

    vmware workstation 安装esx 启动vt功能,支持64bit虚拟机,如下所示: 转载于:https://blog.51cto.com/auqf12/1293587

  2. BIOS不识别linux,linux – 在BIOS中启用VT但KVM无法检测到

    我有戴尔OPTIPLEX 755机器,在B IOS中启用了VT但是当我尝试使用KVM检查时,我收到以下错误 我错过了什么? root@nova-controller:~# kvm-ok INFO: / ...

  3. SEO的操作流程梗概

    SEO的操作流程梗概 影响网站排名的重要SEO因素: 1.关键词位置,特别是关键词是否在标题,这个非常重要 .关键词页面密度,只是在标题上有关键词是不够的,还需要内容中包含适量关键词 3.内容原创性. ...

  4. 开源项目-基于Intel VT技术的Linux内核调试器

    本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...

  5. 树莓派小车python操作流程--龙邱科技

    ▌第一部分 环境解决 1.1 软件版本 发货前已经配置好软件环境: Linux raspberrypi 5.4.51 Python 3.7 OpenCV-python 3.4.6.27 1.2 TF卡 ...

  6. 计算机主机组装的过程,电脑主机组装需要怎样的操作流程简单至极?

    原标题:电脑主机组装需要怎样的操作流程简单至极? 当今网络时代的天下,很多人都想自力更生.想靠自己动手来完成一台电脑的组装.对于一些刚入门的装机用户来说,可能觉得装机还是一件复杂的技术活,例如CPU. ...

  7. Android提示版本号更新操作流程

    Android提示版本号更新操作流程 2014年5月8日: andorid的app应用中都会有版本号更新的操作,今天空暇的时候就花了点心思弄了一下.主要技术方面用到了AsyncTask异步载入.htt ...

  8. 关于滴水的VT调试器

    关于滴水的VT调试器 by 海风月影 论坛上今天吵的比较火热,主要是关于滴水的VT调试器,很多人不了解这个东西,我对Intel的VT技术略有了解,所以我来简单的介绍一下. 第一,什么是VT技术 VT是 ...

  9. 网站建设特定操作流程了解一下不吃亏

    建设一栋楼房可能只要一年的时间,但是建设一个网站可能要一生的时间,只要你有耐心,你就可以一直将网站建设下去.正所谓,学无止境,只要能够掌握好基础网站建设知识才能制作出更高质量的网站.况且网站建设还有特 ...

  10. python编写程序的一般步骤-Python编写win程序的操作流程

    今天给大家讲的是Python怎样编写win程序的方法,对Python编写win程序的操作流程感兴趣的同学们就一起学习下具体方法吧! Python编写win程序的操作流程 1.在app.py同一目录下建 ...

最新文章

  1. MIT 6.824 Lab2A (raft) -- Leader Election
  2. python人脸对比相似度_python人脸对比
  3. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
  4. ImportError: dynamic module does not define module export function (PyInit__caffe)
  5. Redis-哨兵机制,实现高可用
  6. Go 用JSON加载表格数据
  7. I/O多路复用之select,poll,epoll简介
  8. Java HashSet和ArrayList的查找Contains()时间复杂度
  9. 基于正点原子stm32mini板的串行通信原理
  10. 好看实用的六个html登录页面
  11. 【车载音乐】数10G车载音乐包,MP3高品质无损音乐素材合集
  12. java string转elements_Java异常堆栈信息转String
  13. 火狐浏览器屏蔽百度热榜的方法
  14. 怎么把几个PDF文件合并成一个PDF
  15. 快应用联盟展示入口合集(11月更新)
  16. nginx-2-讲解与使用
  17. IQD晶振AT切割方式及流程
  18. 2014年工作中遇到的20个问题:1-20
  19. 分享72个ASP江湖论坛源码,总有一款适合您
  20. Python爬虫添加代理IP池(新手)

热门文章

  1. 网页游戏外挂的设计与编写:QQ摩天大楼【二】(登陆准备-信息处理方式)
  2. 【AC自动机】P3966 [TJOI2013] 单词
  3. 2010年度 中国WEB应用防火墙厂家和产品大全
  4. NOD32杀毒软件升级ID
  5. Pytorch 微调(Fine-tuning)
  6. [OCCT] Open CASCADE Technology的编译(包含示例的编译)
  7. Jenkins 登录时离线 offline
  8. 如何用tomcat模拟集群,要求负载均衡(Nginx),并保持session一致性!
  9. Python正则表达式(网址正则/超链接正则)
  10. 夜,依旧寂寞心照不宣!