更改一些 MMU 转换表条目 - 正确的方法是什么?

标签 c arm virtual-memory tlb

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

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

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

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

最佳答案

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

关于更改一些 MMU 转换表条目 - 正确的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11349964/

相关文章:

linux - 虚拟内存到物理内存

c - fork() 之后地址、值和指针会发生什么

c - 在不知道整数的实际个数的情况下扫描多个整数

c - 在 C 中进行谓词赋值的更好方法?

c - ARM 的微优化 C 代码

c - ARM 项目中的板支持库链接错误

linux - linux栈区为什么有可执行保护?

c - 指示哪个线程设置计时器处理程序?

c - 为什么使用 if condition (0 == Indx) 而不是 (Indx == 0) ——有区别吗?

linux - 如何在安装了 fun_plug 0.5 的 D-Link DNS 325 上编译 NodeJS?