Arm 改变TTB_基的更好方法是什么?

Arm 改变TTB_基的更好方法是什么?,arm,Arm,据我所知,在ARM中关闭/打开mmu并不是切换TTB_基座的好方法。那么,什么是更好的方法呢? 主要步骤是这样的吗?(臂920T臂V4T) 一,。同步数据缓存-->外部内存 2.清除缓存()&使缓存无效();//这是我的问题,如果当前指令在icache中出现,那么我将清除并使其无效,ARM core如何知道下一步是什么?ARM内核可以再次从外部存储器获取指令吗 3.使整个tlb无效 4.更改ttb基址寄存器 还有更好的办法吗?感谢您的帮助^_^ 切换TTB_基座与打开MMU基本相同。操作前有一个

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

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


还有更好的办法吗?感谢您的帮助^_^

切换
TTB_基座
与打开MMU基本相同。操作前有一个内存空间,操作后有另一个内存空间。您需要当前正在执行的代码在操作期间保持有效。选择是,

  • 将当前代码映射到两者中的相同位置
  • 依赖缓存进行转换
  • 第一个基本上是在启用MMU时使用phys
    =
    virt。更新
    TTB_BASE
    时,旧版本的完整副本是最基本的。如果中断被锁定,您可能只需要映射切换代码所需的页面。这可能是一个两阶段操作,其中当前代码页最终被重新定位到某个其他内存地址。首先为页面添加别名,分支到别名位置并删除原始页面。在每一步中,都可以安全地刷新TLB和缓存。根据更改的上下文,您可能不需要这样做。但是,在第一次刷新之后,对于d-cache、i-cache和TLB中的每一个,后续刷新并不昂贵

    第二种方法比较简单。在StrongARM上,启用MMU时,这被称为死亡之舞。基本上,指令是定时的,因此预取和NOP填充将对指令进行排序,以便在转换时执行从phys地址到virt地址的分支。要更新
    TTB_BASE
    ,您可以假设当前代码页位于TLB中,如果代码正确对齐,它将启动一条I-CACHE线。在CPU提取任何内存之前,
    TTB_BASE
    更新之后可能会执行大约六条指令。如果不刷新TLB,则为整页


    我只能看到第二种方法在管理程序想要频繁切换整个内存映射的情况下使用;通常,虚拟机监控程序只会更改上下文开关上的部分内存映射。第二种方法速度稍快,但缺点应该是显而易见的。

    ARM内存管理在体系结构的发展过程中有了很大的进步。请提供有关您的目标处理器或体系结构版本的信息。ARM920T arm core ARMV4T arch。非常感谢,第1种方式似乎更安全。这正是我需要的。。谢谢^_^