caching - 处理指令流中的 MMU 转换错误 - MMU 会发生什么?

标签 caching cpu tlb mmu

这个问题并不特定于任何 CPU 实现,但欢迎特定于 CPU 的答案。

我目前正在实现一个完全支持 MMU 的 CPU,并且出现了一个简单的问题。

因此,想象一下由指令流(或指令缓存)引起的简单 TLB 未命中的情况。这将触发 TLB 未命中。现在,如果未找到 PTE,则会触发一些异常,例如“页面翻译错误”。到目前为止,完全没有问题。

现在,为了调用故障处理程序,指令流(或缓存)需要获取异常处理程序代码。为此,它需要在 TLB 中再次搜索相关的 PTE 条目,并最终进行另一次表遍历。

想象一下,再次找不到 PTE 条目。人们期望调用其他一些异常处理程序。

现在,在最后一个异常处理程序中,由于处理程序本身可能找不到或无效,因此在获取和执行处理程序之前是否会禁用 MMU(从而绕过 MMU 所做的一切,包括 Phys-Virt 映射),或者是还有另一种技术(非致命)来处理这种情况吗?

阿尔维

最佳答案

对于现实世界的操作系统,我不能肯定地说这一点,但从研究小内核的一点经验来看,重点似乎始终是确保页面错误处理程序本身永远不会被调出,并且始终会被调出。位于永远不会引发页面错误的位置。这将确保您的问题中描述的情况永远不会出现。

一般来说,核心内核代码的某些部分静态驻留在具有已知映射的物理内存上似乎是有道理的;但考虑到您无论如何都在尝试编写一个完整的支持虚拟内存的操作系统,我想您会知道这一点。

关于caching - 处理指令流中的 MMU 转换错误 - MMU 会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32289311/

相关文章:

javascript - asp.net Intranet 站点部署后取消缓存用户浏览器内容?

mysql - 选择缓存数据库结果?

c++ - 获取寄存器/缓存中的当前值?

c - 将功能分配给CPU

assembly - 从Intel上的CPUID结果了解TLB

ruby-on-rails - 更改模型以使用 redis 缓存平均评分

caching - 在客户端刷新 GWT 应用程序

mysql - 是什么让这个查询如此缓慢? (MySQL 5.6.36)

caching - 即使页面已经在 tlb 中,如何强制页面发生故障?

c - Linux 上内存映射文件的大页面