原文地址 Page Protection Keys
页面保护
Page Protection Keys(页面保护键)
由于写入错误,内存损坏是复杂的多线程应用程序的问题。 例如,并非数据库应用程序中的代码的每个部分都需要具有相同的特权级别。 日志编写器应具有对日志缓冲区的写特权,但在其他页面上应仅具有读特权。 同样,在具有用于某些关键数据结构的生产者线程和消费者线程的应用程序中,生产者线程可以被赋予特定页面上的消费者线程的附加权限。
基于页面的内存保护机制可用于加强应用程序。然而,页表更改对于性能来说是代价很高的,因为这些更改需要转换后备缓冲区(TLB)故障和后续的TLB故障。保护键提供了一种用户级的、页面粒度的方式来授予和撤销访问权限,而无需更改页表。
保护密钥为用户页面提供16个域,并使用页面表叶节点的位62:59(例如PTE)来标识保护域(PKEY)。 每个保护域在称为PKRU的新线程专用寄存器中都有两个权限位。 在内存访问中,页表查找用于确定访问的保护域(PKEY),并且从PKRU寄存器内容确定相应的保护域特定的权限,以查看是否授予访问和写入权限。 仅当保护密钥和旧版页面权限均允许访问时,才允许访问。 保护键违规将以新的页面错误错误代码位报告为页面错误。 保护密钥对超级用户页面无效,但是超级用户对用户页面的访问与用户访问受到相同的检查。
上图是带有保护键的内存数据访问图。将PKEY与PKRU通过与门
。
为了从保护密钥中获益,需要虚拟机管理器、操作系统和编译器的支持。利用该特性不会造成性能影响,因为它是内存管理体系结构的扩展。