更改TTB_BASE的更好方法是什么?

时间:2013-05-08 07:26:08

标签: arm

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

  

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

还有另一种更好的方法吗?任何帮助赞赏! ^ _ ^

1 个答案:

答案 0 :(得分:2)

切换TTB_BASE与打开MMU非常相似。在操作之前,有一个存储空间,之后还有另一个存储空间。您需要当前执行的代码在操作期间保持有效。选择是,

  1. 将当前代码映射到两者中的相同位置。
  2. 依靠缓存过渡。
  3. 启用MMU时,1 st 基本上与 phys == virt 一起使用。更新TTB_BASE时,旧版本的完整副本是最基本的。如果中断被锁定,您可能只需要映射切换代码所需的页面。这可能是两阶段操作,其中当前代码页最终重新定位到某个其他存储器地址。首先别名页面,分支别名位置,然后删除原始页面。在每一步,都可以安全地刷新 TLB 和缓存。您可能不需要这样做,具体取决于更改的上下文。但是,在第一次 flush 之后,对于 d-cache i-cache TLB中的每一个,后续刷新并不昂贵

    2 nd 方法相当不错。在 StrongARM 上,当启用MMU时,这被称为死亡之舞。基本上,时间指令使得预取和 NOP 填充将对指令进行排序,以便从 phys 地址执行分支到< em> virt 在转换时正确地址。要更新TTB_BASE,您可以假设当前代码页位于TLB中,如果代码对齐,则会启动 I-CACHE 行。在TTB_BASE更新之后,可能会执行大约六条指令,然后CPU将获取任何内存。如果您不刷新 TLB ,则为完整页面。

    我只能看到在虚拟机管理程序的情况下使用的2 nd 方法,它想要经常切换整个内存映射;通常,虚拟机管理程序只会更改上下文切换上的部分内存映射。 2 nd 方法稍微快一些,但下方应该是显而易见的。