Intel MPK (Memory Protection Keys)
MPK是一种用户空间基于页的内存权限管理机制。
标记
将页表条目中预留的4个位用于"protection key",最多可以提供16个key来标记内存页 (0000~1111)。
权限控制
PKRU (protection key rights for user pages) 是一个32位的寄存器,用于存储每个key的访问权限。每个key具有两个对应的位(访问禁止 和 写禁止)。这些权限仅在数据访问时强制执行,而对指令提取无效。
指令RDPKRU
和WRPKRU
分别用于读和写PKRU,这两条指令都不是特权指令,在用户空间运行,不需要上下文切换,开销小(20cycles左右)。
硬件支持情况
与系统调用mprotect
区别:
- 更新PKRU不需要系统调用,比mprotect快很多(MPK在标记页的时候需要进行系统调用)。
- MPK的保护时线程本地的,不同线程的访问权限可能不一致,与对应的PKRU有关,而mprotect会影响整个进程。
https://community.intel.com/legacyfs/online/drupal_files/managed/a4/60/325384-sdm-vol-3abcd.pdf
https://www.kernel.org/doc/html/latest/core-api/protection-keys.html
https://charlycst.github.io/posts/mpk/
https://mstmoonshine.github.io/p/intra-unikernel-mpk/