切换TTB_BASE
与打开 MMU 大致相同。运算前有一个内存空间,运算后有另一个。您需要当前执行的代码在操作期间保持有效。选择是,
- 将当前代码映射到两者中的相同位置。
- 依靠缓存进行转换。
启用 MMU 时,第一个基本上是phys ==
virt 。更新TTB_BASE
旧版本时的完整副本是最基本的。如果中断被锁定,您可能只需要映射切换代码所需的页面。这可能是一个两阶段操作,其中当前代码页最终重新定位到某个其他内存地址。首先为页面设置别名,分支到别名位置并删除原始页面。在每一步,刷新TLB和缓存都是安全的。您可能不需要这样做,具体取决于更改的上下文。然而,在第一次冲洗之后,对于d-cache、i-cache和TLB中的每一个,后续刷新并不昂贵。
第二种方法相当古怪。在StrongARM上,当启用 MMU 时,这被称为死亡之舞。基本上,指令是定时的,以便预取和NOP填充将对指令进行排序,以便在转换时执行从phys地址到virt地址的分支。为了更新,您可以假设当前代码页在 TLB 中,如果代码正确对齐,它会启动I-CACHE行。大约有六个指令可以在TTB_BASE
TTB_BASE
在 CPU 获取任何内存之前更新。如果您不刷新TLB ,它是一整页。
我只能看到第二种方法在想要频繁切换整个内存映射的管理程序的情况下使用;通常管理程序只会在上下文切换时更改部分内存映射。第二种方法稍微快一些,但缺点应该很明显。