页面错误处理程序可以生成更多页面错误吗?

dev*_*ium 2 linux operating-system cpu-architecture tlb page-fault

当我们处于用户模式并且发生页面错误时,我有些困惑。

IIRC,当TLB尝试将我的(用户空间)虚拟地址映射到物理地址时将发生页面错误,并且它将失败。

然后,它将生成将由OS同步处理的异常。但是现在的问题是:此异常处理程序代码的地址及其相关数据很可能也不会在TLB中!

这是递归的还是此内存地址的内核范围受不同规则的约束(例如,虚拟/物理内存之间的自动映射,以避免需要使用TLB?)

谢谢!

Pet*_*des 5

不,Linux不会换出内核内存。 (由于这个原因和类似原因,例如,确保在访问内存的任何随机指令之前都不会运行页面错误处理程序)。

确实对某些内核内存进行分页的OS肯定需要将页面错误处理程序,页表和磁盘I / O代码保留在内存中...


该异常处理程序代码及其相关数据也将不在TLB中!

您正在将页面遍历(在TLB未命中)与页面错误(虚拟页面的条目无效或权限不足,如果有必要,则在页面遍历之后进行)相混淆。

在x86和大多数(?)其他ISA上,页面遍历由硬件完成。请参阅L2 TLB丢失后会发生什么?

操作系统为CPU提供顶层页面表的物理地址(mov cr3, rax例如x86),并且CPU透明地处理所有其他内容。(唯一的软件TLB管理是在修改内存中的页表条目之后,使可能缓存的条目无效(例如x86 invlpg))

当阵列上的循环接近页面边界时,硬件页面表管理允许CPU 推测性地执行TLB遍历,而不必等到实际负载触及下一页。乱码执行和很多其他好处可以部分隐藏页面漫游延迟。Skylake甚至有2个走纸装置,因此它可以并行处理2个TLB遗漏(这两者可能都是投机性或需求性的)。


在具有软件页面遍历的ISA上,TLB缺失处理程序与页面错误处理程序是分开的。

例如,在MIPS上,有一个特殊的地址范围,其映射范围与普通内核虚拟地址不同:

如果地址以0b100[最高3位] 开头,则转换为最低512 MB的物理内存,并且不会通过TLB。(缓存和未映射)。叫kseg0。用于内核指令和数据。

MIPS TLB处理-https: //people.csail.mit.edu/rinard/teaching/osnotes/h11.html

(设置了高位的MIPS地址只能由内核代码,用户空间访问错误使用,即,为MIPS引入了上半部分内核。)

这有点像将512MiB巨大页面映射到烘焙到硬件中的低物理内存。显然,内核希望将其页面查找数据结构保持在该范围内,但是它可以使用其想要的任何数据结构,例如基于起始/长度。