VA转换成MVA 供cache、MMU使用
VA->MVA的方法(硬件自动完成):
if(VA<32M)
MVA=VA|(PID<<25) //PID通过读CP15的C13获得
else
MVA=PA
为什么要这样转换?
MVA=VA|(PID<<25) 是因为VA|(PID<<25)就等相当于VA|32M*PID(假设移位不溢出,那么就是VA+32M*PID)。可是,为什么32M以下的VA就要转换而32M以上的VA却不用转换呢?
另外,假如两进程各自的VA1=VA2>32M,那么将会怎么办呢?
这个是因为在快速上下文切换中进程只有32M虚拟空间。从0到32M-1。这个是基本条件。
所有的进程虚拟空间都是一样的,这样是为了物理空间可以不重合,方便调度,所以低位相同,传给mmu的时候只要va的高7位为pid就能自动区分了。就是mva=va+pid<<25. 当va大于32M的话,那就不一定是本进程的空间了,也没法转化成mva了。所以当va大于32M的时候可能是访问了别的进程空间了。只要不是访问0进程就可以了。
利用PID生成MVA的目的是为了减少切换进程时的代价:如果不使用MVA,当两个进程的VA有重叠时,在切换进程时为了把重叠的VA映射到不同的PA上,需要重建页表、等等,代价非常大。如果使用MVA:假设进程1,2运行时的VA都是0~(32M-1),但它们的MVA并不重叠,分别为:0x0200 0000~0x03ff ffff、0x0400 0000~0x05ff ffff,这样就不用重建页表、等等....