1

据我所知,关闭/打开 mmu 并不是在 ARM 中切换 TTB_BASE 的好方法。那么更好的方法是什么?主要步骤是这样的吗?(ARM 920T ARMV4T)

1. 同步 dcache --> 外部存储器
2。clean_icache () && invalidate_dcache () ; // 这是我的问题,如果当前指令已经在 icache 中,那么我清理并使其无效,ARM 内核如何知道下一步是什么?ARM 内核可以再次从外部存储器中获取指令吗?
3. 使整个 tlb 无效
4. 更改 ttb 基址寄存器

还有其他更好的方法吗?任何帮助表示赞赏!^_^

4

1 回答 1

2

切换TTB_BASE与打开 MMU 大致相同。运算前有一个内存空间,运算后有另一个。您需要当前执行的代码在操作期间保持有效。选择是,

  1. 将当前代码映射到两者中的相同位置。
  2. 依靠缓存进行转换。

启用 MMU 时,一个基本上是phys == virt 。更新TTB_BASE旧版本时的完整副本是最基本的。如果中断被锁定,您可能只需要映射切换代码所需的页面。这可能是一个两阶段操作,其中当前代码页最终重新定位到某个其他内存地址。首先为页面设置别名分支别名位置并删除原始页面。在每一步,刷新TLB和缓存都是安全的。您可能不需要这样做,具体取决于更改的上下文。然而,在第一次冲洗之后,对于d-cachei-cacheTLB中的每一个,后续刷新并不昂贵。

第二种方法相当古怪StrongARM上,当启用 MMU 时,这被称为死亡之舞。基本上,指令是定时的,以便预取和NOP填充将对指令进行排序,以便在转换时执行从phys地址到virt地址的分支。为了更新,您可以假设当前代码页在 TLB 中,如果代码正确对齐,它会启动I-CACHE行。大约有六个指令可以在TTB_BASETTB_BASE在 CPU 获取任何内存之前更新。如果您不刷新TLB ,它是一整页。

我只能看到第二种方法在想要频繁切换整个内存映射的管理程序的情况下使用;通常管理程序只会在上下文切换时更改部分内存映射。第二种方法稍微快一些,但缺点应该很明显

于 2013-05-08T17:27:55.680 回答