我们在以前提到过,Intel通过多核技术,推翻了PowerPC,SPARC等大小型机的反动统治,将计算技术带入了一个崭新的时代,并迅速在服务器领域占据统治地位。
但是,另一股暗流从弱到强,像当初游荡在欧洲的共产主义幽灵一样。
早在2000年,ARM处理器就成为了移动端手机处理器的事实标准。2010年代,随着Apple、Android手机的快速普及,也出现了ARM服务器,用于手机游戏等应用的开发环境。
由于ARM处理器的性能与Intel Xeon存在差距,且应用生态也不够丰富,因此,在2010年起的近十年间,ARM服务器的出货量与x86服务器相比,有着数量级的差距。
与此同时,在地球另一半的东方,这股暗流从来没有停止冲撞和奔腾。早在2001年,中国海军航空兵英雄以生命捍卫海疆的行动过后,美国就将以北京航空航天大学为代表的一批单位列入了“实体清单”,限制对这些单位出口先进的计算机等科技产品。
从此,中国人走上了自研CPU的艰难的道路,其中一个探索的方向就是ARM处理器,在这条探索的道路上,还出现了飞腾系列处理器等具有实用价值和领先性的成果。
显然,ARM和x86处理器的架构是有差异的,而ARM架构下,虚拟化的实现也和x86是不一样的。
ARM与x86的Ring 0 ~ Ring 3类似,也有四个异常等级Exception Level(简称EL)。与x86相反的是,EL0的权限最低,而EL3的权限最高。
对于生产虚拟机,并为虚拟机分配独占的PCI-E外设(如GPU卡、NVMe SSD和RDMA网卡等设备),需要实现以下几件事:
1、实现虚拟机上GuestOS内核的特权级别高于用户态应用,但与真实物理机的内核特权级别有区别;
2、把虚拟机的内存空间、外设PCI-E配置空间和BAR空间正确地映射到对应的真实硬件物理地址(也就是逻辑分析仪抓到的总线上的地址)
3、把分配给虚拟机的硬件中断通到虚拟机的操作系统处理;
在ARM AArch64体系中,虚拟机的用户态在EL0运行,虚拟机的GuestOS在EL1运行,宿主机上的Hypervisor(如KVM)在EL2运行,而系统固件BIOS等在EL3运行。这一点与Intel体系有较大的差异(其实也就是没有VM_ENTRY和VM_EXIT了,处理器的特权级别为虚拟化做了原生的设计)
ARM的内存虚拟化和Intel类似,是两级地址转换(Stage-2 Translation)实现的。
如图,对于虚拟机中程序访问的地址(Virtual Address Space),首先由GuestOS管理的地址转换表TLB翻译为虚拟机的物理地址(Virtual Physical Address),也称为中间物理地址(Intermediate Physical Address)。这种转换机制与x86几乎是完全一样的。
较为复杂的机制是ARM的中断管理。
ARM的终端管理由GIC(Generic Interrupt Controller)来控制。GIC的作用为:
1、接受硬件中断电信号;
2、进行初步处理,确定这个电信号应当触发哪个中断;
3、将中断分发到处理者。
如图,ARM V8 Cortex A系列的GICv3包含以下组件:
Distributer:用于管理SPI(Shared Peripheral Interrupt,共享外设中断),可以类比Intel x86_64的APIC,可基于CPU的配置,将到来的中断源派发到Redistributer;
Redistributer:用于管理PPI(Private Peripheral Interrupt,私有外设终端)/SGI(Software Generated Interrupt,软件生成中断)/LPO(Locality-specific Peripheral Interrupt,本地特殊外设终端),将这些中断发送到CPU Interface;
CPU Interface:将中断传输给Core;
ITS:用来解析LPI中断;
其中,Distributer,Redistributer和ITS在GIC内部实现,而CPU Interface在CPU核内部实现。
看到这里,我们理解了,GPU、网卡和NVMe SSD为代表的PCI-E设备产生的MSI(Message Signaled Interrupts)中断属于SPI,可以通过对GICv3进行编程,将MSI定向到特定的CPU核。但是,这里仍然没有解决另一个问题。
这是什么问题呢?
请看下期分解。