更改一些MMU翻译表条目 - 正确的方法?

时间:2012-07-05 18:02:09

标签: c arm virtual-memory tlb

更新翻译表中的条目有哪些步骤?

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

当我遍历表时,一切看起来应该是这样(意味着其他进程区域设置为"在USR模式下无法访问")。

修改 我还在TLB失效之前执行完全缓存清理和无效(在两个缓存上),但这不会改变任何内容。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

出于某些原因,您应该将页面表的区域映射为强烈排序,这会对您的性能造成一定影响但仍应比写入表格或发出内存屏障后刷新完整缓存更好。

我真的不明白你要问的是什么,或者你究竟有什么问题,但这就是我在我的软件中使用的内容:

.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);