1。同步dcache - >外部记忆
2。 clean_icache()&& invalidate_dcache(); //这是我的问题,如果当前的指令在icache中,那么我清理&使它们失效,ARM核心如何知道下一步是什么?可能ARM内核再次从外部存储器中获取指令吗?
3.使整个tlb无效 4.更改ttb基址寄存器
还有另一种更好的方法吗?任何帮助赞赏! ^ _ ^
答案 0 :(得分:2)
切换TTB_BASE
与打开MMU非常相似。在操作之前,有一个存储空间,之后还有另一个存储空间。您需要当前执行的代码在操作期间保持有效。选择是,
启用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 方法稍微快一些,但下方应该是显而易见的。