最简单的hypervisor
ARM v6引入了security extension,把硬件资源划分成了两个部分secure world和normal world。当CPU运行在secure world的时候,它可以访问所以的硬件资源,但当CPU运行在normal world的时候,它只能访问normal world的资源。ARM v7引入了virtualization extension,在normal world里面加入了一个新的CPUmode:HYP mode。这样CPU 在normal world运行的时候就有三种模式:USR mode, SVC mode和HYP mode,分别对应PL0, PL1, PL2(PL:privilege level),number越大,权限越高。我对这里所说的权限的理解是:寄存器的访问和指令的执行。比如说一些特殊的寄存器(HVBAR)只能再HYP mode里面才能访问,一些特殊的指令(HVC)只能再SVC 或者 HYP mode执行。而CPU处于哪个模式是由CPSR这个寄存器决定的。这里主要探讨的是虚拟化技术,更多的是介绍HYP mode这个新的CPU模式,secure world只会偶尔提到一下。
我不知道,大家对kernel的理解是什么?个人的理解kernel就是exception vector(异常向量表)和相应的handler。Vector的格式和在内存的位置可以说是由硬件确定的,而vector的每一项handler是kernel programmer编写的。系统刚启动的时候,是先初始化的kernel,这里可能有很多朋友有疑问User Space是怎么来的呢?其实答案很简单,就是kernel初始化完了,User Space code需要运行的时候,kernel 把CPSR的CPU mode一改,然后把PC指向User Space的code,自此以后整个系统就开始有PL0和PL1,PL0进PL1通过SWI指令(system call),PL1回PL0通过复原CPSR。
类似的,hypervisor也是由HYP exception vector和handler。一个最简单的hypervisor就是HVBAR寄存器定义vector的位置,在offset 0x14的地方放一个eret指令。这样的hypervisor可以处理kernel发起的HVC call。后续的博客会让这个最简单的hypervisor一点点长大。。。