vt-d 基本操作流程

29 篇文章 5 订阅
订阅专栏

在这里插入图片描述

操作步骤

在这里插入图片描述

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:dword
        push HighPart
        push LowPart
        vmptrld qword ptr [esp]
        add esp,8
        ret
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

.code

Asm_CPUID	Proc	uses ebx esi edi fn:dword, ret_eax:dword, ret_ebx:dword, ret_ecx:dword, ret_edx:dword
        mov	eax, fn
        cpuid
        mov	esi, ret_eax
        mov	dword ptr [esi], eax
        mov	esi, ret_ebx
        mov	dword ptr [esi], ebx
        mov	esi, ret_ecx
        mov	dword ptr [esi], ecx
        mov	esi, ret_edx
        mov	dword ptr [esi], edx
        ret
Asm_CPUID 	Endp

Asm_ReadMsr		Proc	Index:dword
        mov	ecx,Index
        rdmsr
        ret
Asm_ReadMsr		Endp

Asm_WriteMsr	Proc	Index:dword,LowPart,HighPart
        mov	ecx, Index
        mov	eax, LowPart
        mov	edx, HighPart
        wrmsr
        ret
Asm_WriteMsr 	Endp

Asm_Invd Proc
        invd
        ret
Asm_Invd Endp

Asm_GetCs PROC
        mov		eax, cs
        ret
Asm_GetCs ENDP

Asm_GetDs PROC
        mov		eax, ds
        ret
Asm_GetDs ENDP

Asm_GetEs PROC
        mov		eax, es
        ret
Asm_GetEs ENDP

Asm_GetSs PROC
        mov		eax, ss
        ret
Asm_GetSs ENDP

Asm_GetFs PROC
        mov		eax, fs
        ret
Asm_GetFs ENDP

Asm_GetGs PROC
        mov		eax, gs
        ret
Asm_GetGs ENDP

Asm_GetCr0		Proc
        mov 	eax, cr0
        ret
Asm_GetCr0 		Endp

Asm_GetCr3		Proc
        mov 	eax, cr3
        ret
Asm_GetCr3 		Endp

Asm_GetCr4		Proc
        mov 	eax, cr4
        ret
Asm_GetCr4 		Endp

Asm_SetCr0		Proc 	NewCr0:dword
        mov 	eax, NewCr0
        mov	cr0, eax
        ret
Asm_SetCr0 		Endp

Asm_SetCr2		Proc 	NewCr2:dword
        mov 	eax, NewCr2
        mov	cr2, eax
        ret
Asm_SetCr2 		Endp

Asm_SetCr3		Proc 	NewCr3:dword
        mov 	eax, NewCr3
        mov	cr3, eax
        ret
Asm_SetCr3 		Endp

Asm_SetCr4		Proc	NewCr4:dword
        mov 	eax,NewCr4
        mov 	cr4, eax
        ret
Asm_SetCr4 		Endp

Asm_GetDr0 PROC
        mov		eax, dr0
        ret
Asm_GetDr0 ENDP

Asm_GetDr1 PROC
        mov		eax, dr1
        ret
Asm_GetDr1 ENDP

Asm_GetDr2 PROC
        mov		eax, dr2
        ret
Asm_GetDr2 ENDP

Asm_GetDr3 PROC
        mov		eax, dr3
        ret
Asm_GetDr3 ENDP

Asm_GetDr6 PROC
        mov		eax, dr6
        ret
Asm_GetDr6 ENDP

Asm_GetDr7 PROC
        mov		eax, dr7
        ret
Asm_GetDr7 ENDP

Asm_SetDr0 PROC
        mov		dr0, ecx
        ret
Asm_SetDr0 ENDP

Asm_SetDr1 PROC
        mov		dr1, ecx
        ret
Asm_SetDr1 ENDP

Asm_SetDr2 PROC
        mov		dr2, ecx
        ret
Asm_SetDr2 ENDP

Asm_SetDr3 PROC
        mov		dr3, ecx
        ret
Asm_SetDr3 ENDP

Asm_SetDr6 PROC nNewDr6:DWORD
        mov eax,nNewDr6
        mov		dr6, eax
        ret
Asm_SetDr6 ENDP

Asm_SetDr7 PROC	nNewDr7:DWORD
        mov eax,nNewDr7
        mov		dr7, eax
        ret
Asm_SetDr7 ENDP

Asm_GetEflags PROC
        pushfd
        pop		eax
        ret
Asm_GetEflags ENDP

Asm_GetIdtBase PROC
        LOCAL	idtr[10]:BYTE
        sidt	idtr
        mov		eax, dword PTR idtr[2]
        ret
Asm_GetIdtBase ENDP

Asm_GetIdtLimit PROC
        LOCAL	idtr[10]:BYTE
        sidt	idtr
        mov		ax, WORD PTR idtr[0]
        ret
Asm_GetIdtLimit ENDP

Asm_GetGdtBase PROC
        LOCAL	gdtr[10]:BYTE
        sgdt	gdtr
        mov		eax, dword PTR gdtr[2]
        ret
Asm_GetGdtBase ENDP

Asm_GetGdtLimit PROC
        LOCAL	gdtr[10]:BYTE
        sgdt	gdtr
        mov		ax, WORD PTR gdtr[0]
        ret
Asm_GetGdtLimit ENDP

Asm_GetLdtr PROC
        sldt	eax
        ret
Asm_GetLdtr ENDP

Asm_GetTr PROC
        str	eax
        ret
Asm_GetTr ENDP

Vmx_VmxOn Proc LowPart:dword,HighPart:dword
        push HighPart
        push LowPart
        Vmxon qword ptr [esp]
        add esp,8
        ret
Vmx_VmxOn Endp

Vmx_VmxOff Proc
        Vmxoff
        ret
Vmx_VmxOff Endp

Vmx_VmPtrld Proc LowPart:dword,HighPart:dword
        push HighPart
        push LowPart
        vmptrld qword ptr [esp]
        add esp,8
        ret
Vmx_VmPtrld endp

Vmx_VmClear Proc LowPart:dword,HighPart:dword
        push HighPart
        push LowPart
        vmclear qword ptr [esp]
        add esp,8
        ret
Vmx_VmClear endp

Vmx_VmRead Proc uses ecx Field:dword
        mov eax,Field
        vmread ecx,eax
        mov eax,ecx
        ret
Vmx_VmRead endp

Vmx_VmWrite Proc uses ecx Field:dword,Value:dword
        mov eax,Field
        mov ecx,Value
        vmwrite eax,ecx
        ret
Vmx_VmWrite endp

Vmx_VmCall Proc
        vmcall
        ret
Vmx_VmCall endp

Vmx_VmLaunch Proc
        vmlaunch
        ret
Vmx_VmLaunch endp

Vmx_VmResume Proc
        vmresume
        ret
Vmx_VmResume endp


END

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

打开VT-x/VT-d功能
L_Nan的专栏
12-24 2万+
在BIOS中可以打开CPU的VT-x/VT-d功能(这里默认CPU支持VT-x/VT-d虚拟化技术)。 如果不想重启电脑,我们如何判断是否开启了CPU的虚拟化支持呢?在Linux系统,可以通过下面的方法判断。首先判断CPU是否支持VT-x技术? 如果grep --color vmx /proc/cpuinfo执行结果flags中有 vmx ,那么该CPU支持VT-x技术。 flags中有 vmx
Intel VT-d(1)- 简介
10-28 1万+
Intel VT-d的全称是Intel Virtualization Technology for Direct I/O,它是Intel虚拟化技术的一部分,主要针对的是I/O子系统,它的实现主要是通过在硬件上引入重定向单元,该硬件重定向单元用于对I/O子系统的DMA操作和中断传递进行重定向,从而辅助VMM(Virtual Machine Monitor)实现I/O子系统的虚拟化。 一般情况下VM...
VT-D 学习交流
08-24
关于VT-D spec 的学习,整理。 1.对虚拟化I/O硬件支持的功能概述 2.DMA重映射过程 3.中断重映射过程 4.中断发布过程
开启 intel vt-d
weixin_30485379的博客
07-04 1546
1、开机后按“DEL”或“F2”进入BIOS; 2、在Advanced选项页中找到System Agent Configuration并选择进入; 3、进入System Agent Configuration后将VT-D选项设置为Enabled即可。 设置完成后点击F10键即可保存BIOS中的设置,机器会自动重启 转载于:https://www.cnblogs.com/wan...
Intel VT-d(3)- 中断重映射
11-11 4391
VT-d硬件中除了包含DMA重映射硬件外,也会包含中断重映射硬件,该中断重映射单元让系统软件能够对I/O设备产生的中断(包括从I/O APIC发送过来的中断,I/O设备产生的以MSI、MSI-X形式传递的中断,不包含中断重映射硬件本身产生的中断)的传输进行控制,而不仅仅取决于硬件的连接。 对于VT-d硬件而言,中断请求就是从外面发送进来对物理地址范围0xFEEX_XXXXh的写请求。VT-d中,...
Intel 处理器 VT-d 架构 Kernel DMA 保护机制研究
systemino的博客
06-18 6583
这篇文章是对Intel VT-d入门研究的总结,主要是关于DMA重映射编程以及Windows上使用的内容,希望本文可以帮助你对它有一个基本的了解,并在感兴趣的基础上开始研究更多细节。 英特尔VT-d 英特尔VT-d(正式名称是定向I / O的英特尔VT)具有以下三个功能: ·DMA Remapping ·Interrupt Remapping ·Interrupt Posting DMA重映射是其中最常讨论的功能,也是本文的重点。 DMA重映射 DMA重映射是一项重要功能,因为它允许软...
某公司仓库SAP作业指导书及基本操作.docx
02-16
本指导书主要涉及仓库管理的相关流程和SAP中的基本操作,包括发货、收货、状态转移、退货、报废以及查询等关键环节。 一、流程图 1. 原材料/包装材料由新科安达NDC转到XXX黄埔厂:此过程涉及供应链管理,通过物料...
某公司仓库SAP作业指导书与基本操作.doc
09-18
本指导书主要涉及了原材料、包装材料、成品的转仓流程,补仓操作,正常订单处理,退货以及报废等关键业务环节,并详细阐述了各个模块的基本操作事务代码。 **一、流程图** 1. **原材料/包装材料转仓** - 从新...
kvm-vt-d
cybertan的专栏
02-14 5613
How to assign devices with VT-d in KVM [edit] VT-d support In order to assign devices in KVM, you'll need a system which supports VT-d. This has nothing to do with the VT-x support of your CP
VT-d DMA Remapping简介
weixin_50518899的博客
03-22 780
VT-d DMA Remapping的硬件能力主要是由IOMMU来提供,通过引入根Context Entry和IOMMU Domain Page Table等机制来实现直通设备隔离和DMA地址转换的目的。那么具体是怎样实现的呢?下面将对其进行介绍。根据DMA Request是否包含地址空间标志(address-space-identifier)我们将DMA Request分为2类不含地址空间标志的DMA Request。
Intel VT 性能测试
jiaxu2000的博客
03-29 991
熟悉Intel的玩家都知道,Intel在Pentium D 9X0处理器时开始引入VT(Virtualization Technology),VT的好处早在去年我就在blog上介绍过——《硬件虚拟技术初探》,VMware从2005年11月的VMware WorkStation 5.5开始也提供了对VT的支持,到底VT可以给虚拟机性能带来多大的提升呢?今天我做了一个小小的测试。 主机平台:俺的...
kvm vt-d 功能的配置
weixin_33969116的博客
12-09 545
在kvm中,客户机可以使用的设备大概可以分为以下三类: (1)Emulated device:纯软件模拟的设备 (2)virtio device:实现virtio api的半虚拟化驱动的设备 (3)pci device assginment:pci设备直接分配 前面两种类型之前都已经提及过,纯软件模拟的好处是对硬件平台依赖性较低,可以模拟一些较好的设备,不需要客户机额外支持,...
【x86架构】Intel VT-d(1)- 简介
humanof的专栏
09-15 1218
Intel VT-d的全称是Intel Virtualization Technology for Direct I/O,它是Intel虚拟化技术的一部分,主要针对的是I/O子系统,它的实现主要是通过在硬件上引入重定向单元,该硬件重定向单元用于对I/O子系统的DMA操作和中断传递进行重定向,从而辅助VMM(Virtual Machine Monitor)实现I/O子系统的虚拟化。 一般情况下VMM支持I/O虚拟化可以通过以下四种方式实现: 纯软件模拟。即VMM的软件模拟一个现有的I/O设备,这种方式具有较好
Intel VT-d实现概述
最新发布
qq_38350702的博客
03-29 320
VT-d硬件接收到其旗下I/O设备传递过来的中断请求时,会先查看自己的中断重定向功能是否打开,如果没有打开则,直接上传给LAPIC。如果中断重定向功能打开,则会查看中断请求的格式,如果是不可重定向格式,则直接将中断请求提交给LAPIC。如果是可重定向的格式,则会根据算法计算Interrupt_Index值,对中断重定向表进行索引找到相应的IRTE。
VT-x,VT-d简介
热门推荐
bob的博客
06-29 2万+
虚拟化分软件虚拟化和硬件虚拟化,没有VT-x也能虚拟化,很老的机器都可以跑VMWare,因为使用了软件虚拟化的方式,不过运行效率肯定没有硬件虚拟化的高; 硬件虚拟化分两种:CPU层和IO层/芯片层,在Intel平台上,CPU层的虚拟化技术叫VT-x,IO层/芯片层叫VT-d; 一个CPU/一套平台可以同时支持VT-x和VTd,或者都不支持,或者只支持VT-x,决不可能只支持VT-d; 现阶段英特尔SNB/IVB平台都能保证支持VT-x; AMD的虚拟化技术叫AMD-v; 硬件虚拟化需软件支持,例如微软的H.
超线程和VT-d开启与否对性能的影响大不大?
衡水铁头哥的博客
03-13 3613
正文共:1234 字 25 图,预估阅读时间:1 分钟前面在测试VPP的性能和性能调优时,我查阅了VPP官网的相关资料,其中有一条让我有点意外。对于虚拟化扩展功能,前面讲必须启用“英特尔虚拟化扩展”(用于VT-x)和VT-d(用于直接IO)以及DMA重新映射(DMAR)。VT-d启用PCIe直通所需的IOMMU虚拟化功能。此外,应启用中断重新映射,以便可以将硬件中断重新映射到VM以进行PCIe传递...
写文章

热门文章

  • android avb(Android Verified Boot)验证 23258
  • python 的import的含义 19307
  • linux内核 设备号及其devices list (一) 17051
  • Linux下objdump使用方法 13713
  • pcie 配置空间 基地址寄存器(BAR)详解 10352

分类专栏

  • ros 5篇
  • arm 1篇
  • 应用程序 10篇
  • acrn 29篇
  • 同步机制 3篇
  • 汇编 1篇
  • usb学习积累 3篇
  • stm32_f407 7篇
  • dpdk 4篇
  • yocto 3篇
  • EtherCAT 6篇
  • gstream 专栏 1篇
  • linux内核 60篇
  • python 11篇
  • c语言 6篇
  • android 11篇
  • shell 3篇
  • 单片机 1篇
  • selinux 3篇
  • itop4412 9篇
  • c++ 4篇
  • 常用命令 10篇
  • java 1篇
  • opengl
  • openssl 6篇

最新评论

  • ecrt_master_application_time

    zheng是在下: 真能水

  • stm32 启动过程 以及中段重定位

    CSDN-Ada助手: 多亏了你这篇博客, 解决了问题: https://ask.csdn.net/questions/7960222, 请多输出高质量博客, 帮助更多的人

  • raw,img格式虚拟机磁盘空间扩容

    搭车去柏林<‘^′>: 但是为啥拷贝后的没法启动?

  • pcie 配置空间 基地址寄存器(BAR)详解

    Alwin_vx: 这个应该是cpu芯片厂固定分配的

  • pcie 配置空间 基地址寄存器(BAR)详解

    rfc_happy: 没搞明白这个0xF9000000地址是怎么得到的

最新文章

  • ros源码编译
  • U-boot中SPL功能和源码流程分析
  • linux下反汇编命令
2024年1篇
2023年1篇
2022年28篇
2021年20篇
2020年44篇
2019年111篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网标王深圳网站优化系统如何知道网站优化代码效果好的外贸网站优化discuz网站优化网站优化费用一般是什么价栖霞个性化网站优化南京seo网站优化渠道seo优化网站目录招远商城网站优化手机网站代码如何优化阿里巴巴网站如何优化网站seo优化哪里实惠绥芬河网站关键词优化荆门本地网站优化哪家好网站初期优化做什么三沙网站制作优化汉阳优化网站排名公司价格网站内页如何优化才更有人性化郑州网站关键词优化排名工具有实力的网站优化哪家靠谱北辰网站优化服务热线重庆怎么做优化网站排名教程清远企业网站关键词优化工具网站优化必备的关键词挖掘工具新乡百度网站优化找哪家出名的网站推广优化外贸网站seo优化技巧深圳网站优化最好的网络公司大型网站性能优化实战运营南宁seo网站排名优化公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化