VGPU_UNLOCK:为消费者级GPU解锁VGPU功能

2021-04-10 03:29:21

该工具可以使用GeForce和Quadro GPU与NVIDIA VGPUSoftWare。 NVIDIA VGPU通常只支持几个Tesla GPU,但由于某人的Force和Quadro GPU共享与Tesla相同的物理芯片,这是对这些GPU的软件限制。该工具旨在删除此限制。

在以下说明中< path_to_vgpu_unlock>需要在目标系统上用该存储库的路径替换为此存储库,并<版本>需要与NVIDIA网格VGPU驱动程序的版本进行偏移。

安装NVIDIA网格VGPU驱动程序,确保将其安装为DKMS模块。

修改execstart =中的行开头=在/lib/systemd/system/nvidia-vgpud.serviceand /lib/systemd/system/nvidia-vgpu-mgr.service使用vgpu_unlock asexecutable并将原始可执行文件作为第一个参数传递。前任:

修改文件/usr/src/nvidia-< ;version& gt ;/nvidia/os-Interface.c。然后在行开头的行开始后添加义目行。

如果存在VGPU兼容的TESLA GPU,则此脚本只能在使用与所使用的实际GPU相同的物理芯片。

为了确定某个GPU是否支持VGPU功能,ThedRiver查看PCI设备ID。此标识符与PCI VendorID一起对每种类型的PCI设备都是唯一的。为了使VGPU支持WENED告诉驱动程序,即安装GPU的PCI设备ID是VGPU能够的GPU使用的设备ID之一。

Userspace Services NVIDIA-VGPUD和NVIDIA-VGPU-MGR使用IOCTL SYSCALLTO与内核模块进行通信。具体而言,他们读取了PCI设备idand确定已安装的GPU是否是VGPU的能力。

Python脚本vgpu_unlock拦截作为第一个参数和内核的标识到的外部安全性之间的所有IOCTL SYSCALL。该脚本将修改内核响应以指示具有VGPU的PCI设备ID,并启用VGPU的GPU。

为了与GPU交换数据,内核模块将PCI总线的ProvindationAddress空间映射到自己的虚拟地址空间。这是IORemap *内核函数的代替。然后内核模块读取和写入该映射地址空间。这是使用memcpy kernelfunction完成的。

通过将vgpu_unlock_hooks.c文件包括在OS-Interface.c文件中,我们可以为C preprocessor宏替换和拦截对Iormeap和Memcpy函数的调用。执行此操作允许我们维护映射的内容以及正在访问的数据。

这是GCC提供的默认链接器脚本的修改版本。修改标记将nv-kernel.o的.rodata部分放入.dataSection而不是.rodata,使其可写。该脚本还提供TheSymbols vgpu_unlock_nv_kern_rodata_beg和vgpu_unlock_nv_kern_rodata_endto让我们知道该部分开始和结束的位置。

启动后NVIDIA-VGPUD服务查询所有已安装的GPUSAND的内核,检查VGPU功能。此呼叫由VGPU_UNLORKPYTHON脚本拦截,GPU是VGPU的能力。如果FOREDHEN-VGPU的VGPU能够获得GPU,则NVIDIA-VGPU创建了系统创建的MDEV设备和/ sys / class / mdev_bus目录。

现在可以通过将UUID呼应到HIMDEV总线表示中的“创建文件”中创建VGPU设备。这将创建代表MDEV总线上的新VGPU设备的其他结构。然后可以将这些设备分配给VM,并且当VM启动时,它将打开MDEV设备。这会导致NVIDIA-VGPU-MGRTO使用IOCTL开始与内核通信。再次由VGPU_unlock Python脚本中的这些调用,当NVIDIA-VGPU-MGR询问GPU是否是VGPU时,答案更改为YES。在此之后,请检查iTattemps以初始化VGPU设备实例。

VGPU设备的初始化由内核模块处理,并且其自身检查对VGPU功能的检查,这一个是更复杂的。

内核模块映射物理PCI地址范围0xF0000000-0XF1000000进入虚拟地址空间,然后执行一些神奇的操作,该操作&#39; t真正知道他们的所作所为。我们所知道的是,在这些操作项访问0xF0029624的物理地址0xF0029624之前,我们调用了主题值。内核模块还访问ProvinessAddress 0xF0029634的128位值,我们调用键值。

然后,内核模块具有一些查找表,用于魔法值,一个VGPU能够支持GPU,一个用于其他GPU。因此,内核模块在这两个查找表中寻找主题值,如果发现表张开表中包含一组AES-128加密数据块和HMAC-SHA256Signature。

然后通过使用前面提到的键值来验证签名,然后通过加密数据块将HMAC-SHA256签名括起来。如果thesignature是正确的,则使用AES-128和诸如诸如诸如诸例解密块。

因此,为了让内核模块接受GPU作为VGPU的魔术瓦斯必须在VGPU的表格中的魔法值中,密钥Hasto生成有效的HMAC-SHA256签名,AES-128解密的数据块粗量包含一个VGPU有能力的PCI设备ID。如果这些检查中的任何一个失败,则错误代码0x56&#34;呼叫不支持&#34;被退回。

为了使这些检查传递VGPU_UNLOCK_HOKS.C中的钩子将查找映射包含MAGICAND键值的物理地址范围的IOREMAP调用,将这些值的地址重新计算到内核模块的VirtualAddress空间中,监控Memcpy Operations Reading在ThoseDdresses中,如果发生这种操作,请保持值的副本,直到彼此已知,找到NV-Kernel.o的.rodata部分中的查找表,找到签名和数据Bocks,验证签名,解密块,解密块,在解密的数据中编辑PCI设备ID,reencrypt块,再生thesignature并将魔法,块和签名插入VGPucapable魔术值的表中。那个&#39;他们所做的。