在arm中有一个idmap的恒等映射过程,即mmu on 之前建立的物理地址和虚拟地址相等的映射,arch/arm64/kernel/head.S文件中
将整个kernel恒等映射到了idmap区域,实际使用时,只用到mmu_on附近的恒等映射,在mmu打开之前,cpu取址取到的地址为物理地址,mmu打开之后,cpu取到的地址为虚拟地址,cpu是 pipeline 工作的,在执行当前指令时,CPU 很可能已经做了一个动作,就是产生了下一条指令的地址(也就是计算出来了下一条指令在那里)。如果是在 mmu 打开之前,那这个地址就是物理地址,因此,假设当前指令就是在打开 mmu,那么,在执行打开 mmu 这条指令时,CPU 已经产生了一个地址(下一条指令的地址),此时这个地址是物理地址。那么 打开mmu这条指令执行完毕,mmu 生效后,CPU会把刚才产生的物理地址当成虚拟地址,去 mmu 表中查找对应的物理地址,此时的被当成虚拟地址的物理地址,正好在idmap中有恒等映射(虚拟地址等于物理地址),所以
访问不会出问题,随后,mmu打开之后,cpu取到的指令是虚拟地址,即System.map中的虚拟地址,则在swapper mapping中可以找到mapping的物理地址,之后idmap便不再使用