是否有基于线程的mprotect?

dan*_*how 5 linux memory multithreading memory-management

mprotect()用于保护内存页面,例如将页面设为只读。它为整个过程设置了这种保护,也就是说,如果页面是只读的,则没有线程可以写入该页面。有没有一种方法可以针对不同的线程以不同的方式保护页面?例如,1个线程可以写入P页,而程序中的所有其他线程只能从P页读取。

小智 2

对于较新的 Intel CPU,您可以使用内存保护键 [1] 对进程中每个线程的不同访问设置。在 Linux 上,运行lscpu并检查pkuospke标志。

手册页 [2] 上的示例有点过时,因为不再需要手动调用相应的系统调用。相反,glibc 提供以下 API 调用:

  • pkey_alloc() 分配一个新密钥(有 16 个可用)
  • pkey_set() 设置给定密钥的权限
  • pkey_mprotect() 将密钥应用到给定的内存区域
  • pkey_free() 释放密钥

由于维护每个保护键的权限位的寄存器是线程本地的,因此每个线程可以进行不同的保护设置。保护键设置只能进一步锁定一般设置,并不影响取指令。

[1] https://www.kernel.org/doc/Documentation/x86/protection-keys.txt

[2] http://man7.org/linux/man-pages/man7/pkeys.7.html