vt-d 基本操作流程
操作步骤
1检查主板是否支持vt-d
- 检查主板是否能够支持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
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);host state ares
Vmx_VmWrite(HOST_RSP, ((ULONG)g_VMXCPU.pStack) + 0x2000); //Host 临时栈
Vmx_VmWrite(HOST_RIP, (ULONG)VMMEntryPoint); //这里定义我们的VMM处理程序入口虚拟机运行控制域
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));VMEntry运行控制域
Vmx_VmWrite(VM_ENTRY_CONTROLS, VmxAdjustControls(0, MSR_IA32_VMX_ENTRY_CTLS));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 基本操作流程相关推荐
- vmware workstation 安装esx 启动vt功能
vmware workstation 安装esx 启动vt功能,支持64bit虚拟机,如下所示: 转载于:https://blog.51cto.com/auqf12/1293587
- BIOS不识别linux,linux – 在BIOS中启用VT但KVM无法检测到
我有戴尔OPTIPLEX 755机器,在B IOS中启用了VT但是当我尝试使用KVM检查时,我收到以下错误 我错过了什么? root@nova-controller:~# kvm-ok INFO: / ...
- SEO的操作流程梗概
SEO的操作流程梗概 影响网站排名的重要SEO因素: 1.关键词位置,特别是关键词是否在标题,这个非常重要 .关键词页面密度,只是在标题上有关键词是不够的,还需要内容中包含适量关键词 3.内容原创性. ...
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- 树莓派小车python操作流程--龙邱科技
▌第一部分 环境解决 1.1 软件版本 发货前已经配置好软件环境: Linux raspberrypi 5.4.51 Python 3.7 OpenCV-python 3.4.6.27 1.2 TF卡 ...
- 计算机主机组装的过程,电脑主机组装需要怎样的操作流程简单至极?
原标题:电脑主机组装需要怎样的操作流程简单至极? 当今网络时代的天下,很多人都想自力更生.想靠自己动手来完成一台电脑的组装.对于一些刚入门的装机用户来说,可能觉得装机还是一件复杂的技术活,例如CPU. ...
- Android提示版本号更新操作流程
Android提示版本号更新操作流程 2014年5月8日: andorid的app应用中都会有版本号更新的操作,今天空暇的时候就花了点心思弄了一下.主要技术方面用到了AsyncTask异步载入.htt ...
- 关于滴水的VT调试器
关于滴水的VT调试器 by 海风月影 论坛上今天吵的比较火热,主要是关于滴水的VT调试器,很多人不了解这个东西,我对Intel的VT技术略有了解,所以我来简单的介绍一下. 第一,什么是VT技术 VT是 ...
- 网站建设特定操作流程了解一下不吃亏
建设一栋楼房可能只要一年的时间,但是建设一个网站可能要一生的时间,只要你有耐心,你就可以一直将网站建设下去.正所谓,学无止境,只要能够掌握好基础网站建设知识才能制作出更高质量的网站.况且网站建设还有特 ...
- python编写程序的一般步骤-Python编写win程序的操作流程
今天给大家讲的是Python怎样编写win程序的方法,对Python编写win程序的操作流程感兴趣的同学们就一起学习下具体方法吧! Python编写win程序的操作流程 1.在app.py同一目录下建 ...
最新文章
- MIT 6.824 Lab2A (raft) -- Leader Election
- python人脸对比相似度_python人脸对比
- ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...
- ImportError: dynamic module does not define module export function (PyInit__caffe)
- Redis-哨兵机制,实现高可用
- Go 用JSON加载表格数据
- I/O多路复用之select,poll,epoll简介
- Java HashSet和ArrayList的查找Contains()时间复杂度
- 基于正点原子stm32mini板的串行通信原理
- 好看实用的六个html登录页面
- 【车载音乐】数10G车载音乐包,MP3高品质无损音乐素材合集
- java string转elements_Java异常堆栈信息转String
- 火狐浏览器屏蔽百度热榜的方法
- 怎么把几个PDF文件合并成一个PDF
- 快应用联盟展示入口合集(11月更新)
- nginx-2-讲解与使用
- IQD晶振AT切割方式及流程
- 2014年工作中遇到的20个问题:1-20
- 分享72个ASP江湖论坛源码,总有一款适合您
- Python爬虫添加代理IP池(新手)
热门文章
- 网页游戏外挂的设计与编写:QQ摩天大楼【二】(登陆准备-信息处理方式)
- 【AC自动机】P3966 [TJOI2013] 单词
- 2010年度 中国WEB应用防火墙厂家和产品大全
- NOD32杀毒软件升级ID
- Pytorch 微调(Fine-tuning)
- [OCCT] Open CASCADE Technology的编译(包含示例的编译)
- Jenkins 登录时离线 offline
- 如何用tomcat模拟集群,要求负载均衡(Nginx),并保持session一致性!
- Python正则表达式(网址正则/超链接正则)
- 夜,依旧寂寞心照不宣!