ARM CPU上的地址转换过程涉及3个概念:
虚拟地址(VA,Virtual Address)
变换后的虚拟地址(MVA,Modified Virtual Address)
物理地址(PA,Physical Address)
没启动MMU是,CPU,cache,mmu,外设等所有部件使用的都是物理地址。
启动MMu后,CPU 对外发出虚拟地址 VA : VA 被转换为 MVA 供 cache ,mmu使用,在这里MVA被转换为PA;
最后使用PA读写时间设备。
(1) CPU 看到的,用到的只是虚拟地址VA。
(2)cache,mmu是不知道 VA的,它们使用的是 MVA。
(3)实际设备是不知道 VA和MVA的,读写它们时使用的是由 MVA 转换得到的 PA。
如果 VA < 32M,需要使用进程标识号PID(通过读CP15的C13获取)来转换为MVA。
VA 和 MVA 的转换方法如下(这时由硬件自动完成的):
if( VA < 32M) then
MVA = VA | ( PID << 25 ) //VA < 32M
else
MVA = VA //VA >= 32M
利用 PID 生成MVA的目的是为了减少切换进程时的代价:不使用 MVA 而直接使用VA的话,
当两个进程所用的虚拟地址空间(VA)有重叠时,在切换进程时为了把重叠的VA映射到不同的PA上去,
需要重建页表,使无效caches 和 TLBS 等,代价非常大。
使用 MVA 后,进程切换就省事多了:假设两个进程1,2运行时的VA都是0~(32M-1),
但是它们的MVA并不重叠,分别为0x0200 0000 ~ 0x03ff ffff,0x0400 0000 ~ 0x05ff ffff,
这样就不必进行重建页表等工作了。 |