【问题标题】:Changing some MMU translation table entries - the right way? [duplicate]更改一些 MMU 转换表条目 - 正确的方法? [复制]
【发布时间】:2012-07-06 04:33:44
【问题描述】:

更新翻译表中的条目的步骤是什么?

我使用 ARM920T 的 MMU 来获得一些内存保护。 当我在进程之间切换时,我需要更改一些条目以保护其他进程的内存。更新表(在内存中)后,我发出一个完整的 TLB 失效(只是为了确定,也没有锁定的条目),但新进程仍然可以访问前一个进程的数据。

当我遍历表时,一切看起来都应该是正常的(意味着其他进程区域设置为“在 USR 模式下不可访问”)。

编辑 在 TLB 失效之前,我还做了一次完整的缓存清理和失效(在两个缓存上),但这并没有改变任何东西。

【问题讨论】:

    标签: c arm virtual-memory tlb


    【解决方案1】:

    TLB 并不是页面更改后唯一需要维护的东西,尤其是那些包含可执行代码的东西。首先,您需要确保您的更改传播到物理内存(即清理指向您修改的页表的缓存区域)。您将需要使指令缓存无效,因为它可能包含来自旧代码区域的行。根据您的缓存类型,您可能需要在更新页表之前清理数据缓存,并在更改后使数据缓存失效。最后,您需要确保有足够的障碍来强制执行操作按照您指定的顺序完成。

    【讨论】:

      【解决方案2】:

      出于某些充分的原因,您应该将页表的区域映射为强排序,这会稍微损害您的性能,但仍然应该比在写入表或发出内存屏障后刷新完整缓存要好。

      我不太明白你想问什么,或者你到底哪里有问题,但这是我在我的一个软件中使用的:

      .align
      arch_mmu_map_section:
      #if ARM_WITH_MMU
          ldr     r3, =MMU_TLB          @ r3 = &table
          add     r1, r3, r1, lsr #18   @ r1 = &table + offset(entry)
          ldr     r3, =0xFFFFF          @ r3 = (1<<20) - 1
          bic     r0, r0, r3            @ Align r0 to 1 MB
          orr     r0, r0, r2            @ ORR the flags
          str     r0, [r1]              @ Write entry to r1, pointer to entry
          @ Invalidate UTLB
          mov     r3, #0
          mcr     p15, 0, r3, c8, c7, 0
      #endif
          bx      lr
      

      MMU_TLB 是指向表的指针,在 mmu_init 期间被映射为强排序。这个函数的原型是

      void arch_mmu_map_section(addr_t paddr, addr_t vaddr, uint flags);
      

      【讨论】:

      • 问题是:要使翻译表中的更新生效,需要执行哪些步骤。性能不是现在的标准。正如我在我的问题中所说:问题是,我更新了表格,但似乎 mmu 没有考虑这些更改。另请注意,现在我不使用真正的映射(这意味着一切都只是映射平面)。
      • 我知道,平面映射不会影响内存模型,当你映射内存时,你必须提供一些标志,标志和其中的 TX,CB 和其他位决定内存模型该条目的表中映射到的内存部分。 ARM 中有多种内存模型,您应该阅读处理器手册。强排序是最容易处理的,因为所有缓存都会在任何写入操作时自动刷新,并且操作不会乱序执行。现在只需使用强有序内存并刷新 UTLB。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多