CPU虚拟化,内存虚拟化,IO虚拟化以及虚拟化资料链接
资料来源
注:该篇文章只是简单整合一下下面的资料;
(1) 虚拟化底层技术之——iommu技术综述_weixin_33895657的博客-CSDN博客(☆☆☆☆☆)
(2) 还是不理解IOMMU、北桥、PCI的MMIO和ioremap - 内核源码-Chinaunix
(3) CPU虚拟化、内存虚拟化、I/O虚拟化概念_仲夏宁叶香的博客-CSDN博客_内存虚拟化的概念(☆☆☆☆☆)
(4) CPU虚拟化,内存虚拟化和IO虚拟化_weixin_33747129的博客-CSDN博客(☆☆☆☆☆)
(5) 虚拟化的理论-内存和IO虚拟化【图文】_Jeff_Linux_51CTO博客
(6) 虚拟化、CPU虚拟化、内存虚拟化、设备和I/O虚拟化 - _liuxg - 博客园 (cnblogs.com)
(7) https://mp.weixin.qq.com/s/5bcXGwd_76yuxPLRP9gLzQ (公众号-老秦谈芯)
1.虚拟化的分类
服务器虚拟化的实现包括三部分:CPU虚拟化,内存虚拟化和IO虚拟化。
1.1 CPU虚拟化(包括全虚拟化,半虚拟化,硬件虚拟化)
1.2 内存虚拟化(包括全虚拟化,半虚拟化,硬件虚拟化)
1.3 IO虚拟化(包括全虚拟化,半虚拟化,硬件虚拟化)
2.IOMMU(I/O memory management unit)
2.1 IOMMU 主要功能
(1) 控制设备dma地址映射到机器物理地址(DMA remapping);
(2) 中断重映射(interrupt remapping)
2.2 DMA地址空间映射
(1) IOMMU的主要功能为设备dma时刻能够访问机器的物理内存区,同时保证安全性。在没有IOMMU的时候,设备通过dma可以访问到机器的全部的地址空间。
(2) IOMU硬件实现vaddr--->paddr的地址转换。
2.3 中断重映射
(1) 在虚拟化透传设备使用中,或者主机侧用户态驱动框架中还有一个问题就是msi中断的安全保护。msi的特点就是只要发起特定的pci write 消息,机器(在x86上是LAPIC)就能够将此pci write消息翻译为一次中断信号。在msi中断信息里,含有中断源信息,中断vector信息以及中断发往哪里,中断模式等等信息。
(2) ???如果设备透传到虚拟机,而虚拟机里有恶意驱动,那么恶意驱动完全可以操作一个透传设备发起dma write访问,带有msi中断信息,导致hypervisor被攻击。在用户态驱动层面也是相同的,用户态驱动可以触发dma 带有msi中断导致主机系统被攻击。
(3) 为了防止这种情况发生,Intel的iommu技术(vt-d)里实现了中断重映射技术(intremap)。设备发起的msi中断先进入iommu的intremap模块进行映射得到真正的msi中断信息。主机os会在这个中断重映射表里限定,某个设备只能发起哪种中断向量,同时会验证msi中的信息位(如此提升了恶意软件触发真实msi的难度)。
2.4 iommu cache,int remap cache和IOTLB
(1) 在2.1和2.2中提到的转换存在与之对应的转换表,这些转换表都位于物理内存中,从DRAM内存中专门开辟一些空间用于存储这些转换关系,所以在intel vt-d中设计了大量主机侧cache机制来缓存这些表的表项,提升访问效率。
(2) 设备tlb是intel vt-d中设计的设备测tlb寄存器,在设备进行dma的时候在设备一侧缓存dma地址到物理地址映射项。
3.iommu在各个厂商的分身
(1) intel vtd
(2) amd iommu