2

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

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

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

编辑 在 TLB 失效之前,我还进行了完整的缓存清理和失效(在两个缓存上),但这不会改变任何内容。

4

2 回答 2

1

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

于 2012-07-05T18:27:19.067 回答
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);
于 2012-07-05T23:05:00.950 回答