我记得有一次我去应聘ARM-Linux软件工程师。结果被问到ARM中的虚拟内存是怎么管理的。由于我只对X86平台下的MMU了解,所以我被问倒了。原来我所学的只是皮毛。还有很多东西值得我去深入。要做ARM-Linux下的驱动,熟悉虚拟内存应该是必须的。
ARM9中的虚拟内存是怎么实现的呢?以下是我的学习总结。
ARM920T核是通过CP15来实现MMU机制的。
1. 关于地址
要知道虚拟内存机制必须了解ARM9中的3种地址:VA(虚地址),MVA(修正后虚地址),PA(物理地址)
1)VA,是程序中的逻辑地址,0x00000000~0xFFFFFFFF。
2)MVA,由于多个进程执行,逻辑地址会重合。所以,跟据进程号将逻辑地址分布到整个内存中。MVA = (PID << 25) | VA
3)PA,MVA通过MMU转换后的地址。
由2可知,地址位共32位,PID占7位,所以最多只能有 128 个进程。而每个进程可访问的地址位为25位,故只能分到 32MB 的地址空间。(注:不是物理内存空间)
PID是存放在CP15协处理器的C13寄存器的高7位。