更新翻译表中的条目的步骤是什么?
我使用 ARM920T 的 MMU 来获得一些内存保护。当我在进程之间切换时,我需要更改一些条目以保护其他进程的内存。更新表(在内存中)后,我发出一个完整的 TLB 失效(只是为了确定,也没有锁定的条目),但新进程仍然可以访问前一个进程的数据。
当我遍历表时,一切看起来都应该如此(意味着其他进程区域设置为“在 USR 模式下不可访问”)。
编辑 在 TLB 失效之前,我还进行了完整的缓存清理和失效(在两个缓存上),但这不会改变任何内容。
更新翻译表中的条目的步骤是什么?
我使用 ARM920T 的 MMU 来获得一些内存保护。当我在进程之间切换时,我需要更改一些条目以保护其他进程的内存。更新表(在内存中)后,我发出一个完整的 TLB 失效(只是为了确定,也没有锁定的条目),但新进程仍然可以访问前一个进程的数据。
当我遍历表时,一切看起来都应该如此(意味着其他进程区域设置为“在 USR 模式下不可访问”)。
编辑 在 TLB 失效之前,我还进行了完整的缓存清理和失效(在两个缓存上),但这不会改变任何内容。
TLB 并不是页面更改后唯一需要维护的东西,尤其是那些包含可执行代码的东西。首先,您需要确保您的更改传播到物理内存(即清理指向您修改的页表的缓存区域)。您将需要使指令缓存无效,因为它可能包含来自旧代码区域的行。根据您的缓存类型,您可能需要在更新页表之前清理数据缓存,并在更改后使数据缓存失效。最后,您需要确保您有足够的障碍来强制按照您指定的顺序完成操作。
出于某些充分的理由,您应该映射您的页表被强烈排序的区域,这会稍微损害您的性能,但仍然应该比在写入表或发出内存屏障后刷新完整缓存要好。
我真的不明白你想问什么,或者你到底有什么问题,但这是我在我的一个软件中使用的:
.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);