百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

Intel VT-d技术

liebian365 2024-11-20 18:22 17 浏览 0 评论

Inetl VT-d介绍

Intel VT-d的全称是Intel Virtualization Technology for Direct I/O,它是Intel虚拟化技术的一部分,主要针对的是I/O子系统,它的实现主要是通过在硬件上引入重定向单元,该硬件重定向单元用于对I/O子系统的DMA操作和中断传递进行重定向,从而辅助VMM(Virtual Machine Monitor)实现I/O子系统的虚拟化。

VT-d是一个位于CPU、内存和I/O设备之间的硬件设备,通常位于PCI设备树的根部,或者类似的位于I/O子系统的根部,当VT-d重定向硬件设备启用的时候,它会拦截位于它下面的所有I/O设备产生的中断请求和通过DMA方式对虚拟机内存访问的请求,然后通过查找中断重定向表或者I/O页表的方式(类似分页机制)来重新定位中断转发的目标LAPIC或者是I/O设备访问的目标主机物理内存地址。如下图所示:

KVM虚拟机支持将宿主机的PCI、PCI-E设备附加到虚拟化的客户机中,从而让客户机以独占方式访问这个PCI(或PCI-E)设备,通过硬件支持的VT-d技术将设备分配给客户机后,在客户机看来,设备是物理上连接在其PCI(或PCI-E)总线上的,客户机对该设备的I/O交互和实际的物理设备操作完全一样,不需要(或者很少需要)Hypervisor的参与。在KVM中通过VT-d技术使用一个PCI-E网卡的系统架构示例图如下:

Inetl VT-d使用

首先需要在BIOS当中开启,不同主板的开启方法不同,我的是戴尔的R630,在Processor Settings当中找到Virtualization Technology,设置为Enable就可以了。

如果你的BISO已经开启了,一般来说现在的Linux内核也是默认启用的,使用下面命令就可以查看

[root@localhost ~]# dmesg | grep DMAR
[ 0.008663] ACPI: DMAR 0x000000007BAFE000 000108 (v01 DELL PE_SC3 00000001 DELL 00000001)
[ 0.008686] ACPI: Reserving DMAR table memory at [mem 0x7bafe000-0x7bafe107]
[ 0.943354] DMAR: Host address width 46
[ 0.943356] DMAR: DRHD base: 0x000000fbffc000 flags: 0x0
[ 0.943363] DMAR: dmar0: reg_base_addr fbffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.943364] DMAR: DRHD base: 0x000000c7ffc000 flags: 0x1
[ 0.943367] DMAR: dmar1: reg_base_addr c7ffc000 ver 1:0 cap 8d2078c106f0466 ecap f020df
[ 0.943368] DMAR: ATSR flags: 0x0
[ 0.943369] DMAR: ATSR flags: 0x0
[ 0.943370] DMAR-IR: IOAPIC id 10 under DRHD base 0xfbffc000 IOMMU 0
[ 0.943371] DMAR-IR: IOAPIC id 8 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.943372] DMAR-IR: IOAPIC id 9 under DRHD base 0xc7ffc000 IOMMU 1
[ 0.943373] DMAR-IR: HPET id 0 under DRHD base 0xc7ffc000
[ 0.943374] DMAR-IR: x2apic is disabled because BIOS sets x2apic opt out bit.
[ 0.943374] DMAR-IR: Use 'intremap=no_x2apic_optout' to override the BIOS setting.
[ 0.943959] DMAR-IR: Enabled IRQ remapping in xapic mode

可以看到类似 DMAR-IR: Enabled IRQ remapping in xxxxx mode 的输出即可。

隔离隐藏宿主设备

可以使用vfio_pci这个内核模块来对需要分配给客户机的设备进行隐藏,从而让宿主机和未被分配该设备的客户机都无法使用该设备,达到隔离和安全使用的目的。

查看是否开启

[root@localhost ~]# lsmod |grep vfio_pci

如果没有输出表示还未开启,我们可以通过以下命令开启

[root@localhost ~]# modprobe vfio_pci
[root@localhost ~]# lsmod |grep vfio_pci
vfio_pci 53248 0
vfio_virqfd 16384 1 vfio_pci
vfio 32768 2 vfio_iommu_type1,vfio_pci
irqbypass 16384 2 vfio_pci,kvm

当然如果你的内核比较特殊,即vfio_pci已经被编译到内核当中,而不是作为module,则检查/sys/bus/pci/drivers/vfio_pci是否存在即可。

我们可以通过lspci找到设备的BDF,然后将该设备绑定到vfio_pci驱动,这里我们从pci列表当中随便找一个BDF为00:1a.0的设备,这个设备是网卡相关的。

[root@localhost ~]# lspci -s 01:00.3 -k
01:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Subsystem: Dell Gigabit 4P I350-t rNDC
Kernel driver in use: igb
Kernel modules: igb

可以看到目前是绑定到igb这个驱动上,我们先进行解绑,解绑我们需要知道设备在PCI/PCI-E总线的具体位置

[root@localhost ~]# lspci -s 01:00.3 -Dn
0000:01:00.3 0200: 8086:1521 (rev 01)

依次是domain(0000)、bus(01)、slot(00)、function(3),其中domain的值一般为0(如果机器有多个host bridge时,其取值范围是0~0xffff),bus的取值范围是0~0xff,slot取值范围是0~0x1f,function取值范围是0~0x7,其中后三个值一般简称为BDF(即bus:device:function)。

解绑

[root@localhost ~]# echo 0000:01:00.3 > /sys/bus/pci/drivers/igb/unbind
[root@localhost ~]# lspci -s 01:00.3 -k
01:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Subsystem: Dell Gigabit 4P I350-t rNDC
Kernel modules: igb

绑定到vfio_pci上

[root@localhost ~]# echo 0000:01:00.3 > /sys/bus/pci/drivers/vfio-pci/bind
[root@localhost ~]# lspci -s 01:00.3 -k
01:00.3 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Subsystem: Dell Gigabit 4P I350-t rNDC
Kernel driver in use: vfio_pci
Kernel modules: igb

然后我们可以通过以下命令查看qemu当中的vfio_pci驱动的应用。

[root@localhost ~]# qemu-system-x86_64 -device vfio-pci,help
vfio-pci options:
addr=<int32> - Slot and optional function number, example: 06.0 or 06 (default: -1)
bootindex=<int32>
display=<OnOffAuto> - on/off/auto (default: "off")
failover_pair_id=<str>
host=<str> - Address (bus/device/function) of the host device, example: 04:10.0
multifunction=<bool> - on/off (default: false)
rombar=<uint32> - (default: 1)
romfile=<str>
sysfsdev=<str>
x-balloon-allowed=<bool> - (default: false)
x-enable-migration=<bool> - (default: false)
x-igd-gms=<uint32> - (default: 0)
x-igd-opregion=<bool> - on/off (default: false)
x-intx-mmap-timeout-ms=<uint32> - (default: 1100)
x-msix-relocation=<OffAutoPCIBAR> - off/auto/bar0/bar1/bar2/bar3/bar4/bar5 (default: "off")
x-no-geforce-quirks=<bool> - (default: false)
x-no-kvm-intx=<bool> - (default: false)
x-no-kvm-ioeventfd=<bool> - (default: false)
x-no-kvm-msi=<bool> - (default: false)
x-no-kvm-msix=<bool> - (default: false)
x-no-mmap=<bool> - (default: false)
x-no-vfio-ioeventfd=<bool> - (default: false)
x-nv-gpudirect-clique=<uint4> - NVIDIA GPUDirect Clique ID (0 - 15)
x-pci-device-id=<uint32> - (default: 4294967295)
x-pci-sub-device-id=<uint32> - (default: 4294967295)
x-pci-sub-vendor-id=<uint32> - (default: 4294967295)
x-pci-vendor-id=<uint32> - (default: 4294967295)
x-pcie-extcap-init=<bool> - on/off (default: true)
x-pcie-lnksta-dllla=<bool> - on/off (default: true)
x-pre-copy-dirty-page-tracking=<OnOffAuto> - on/off/auto (default: "on")
x-req=<bool> - on/off (default: true)
x-vga=<bool> - on/off (default: false)
xres=<uint32> - (default: 0)
yres=<uint32> - (default: 0)

其中 addr=<int32> - Slot and optional function number, example: 06.0 or 06 (default: -1)属性表示设备在客户机中的PCI的slot编号(即BDF的D-device的值), host=<str> - Address (bus/device/function) of the host device, example: 04:10.0 属性host表示的是指定分配的PCI设备在宿主机中的地址(BDF号)

使用的时候使用类似下述命令就可以使用vfio_pci来独占设备了。

[root@localhost ~]# qemu-system-x86_64 -enable-kvm -smp 4 -m 8G rhel7.3.img -device vfio-pci,host=01:00.3.addr=00




相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: