mprotect机制
Linux系统提供了一个系统调用接口mprotect接口,通过该接口可以在编写Linux程序时给mmap申请到的内存设置权限,从而允许或限制对该部分内存的读写,执行。
函数原型:
int mprotect(constvoid*start,size_tlen,int prot);
说明:自地址start开始,保护长度为len的内存空间。其中prot参数可以有如下取值:

函数返回取值:
成功返回0,失败返回-1,并且设置errno,errno可能有如下取值:

Pkeys保护机制
Pkeys 的工作原理是:在每个页表中,将 4 个先前保留的位专门用于一个“保护键”,从而提供 16 个可能的键。
每个键的保护由一个 per-CPU 用户可访问寄存器(PKRU) 定义。每个 PKRU 都是一个 32 位寄存器,为 16 个键中的每个键存储两位(访问禁用和写入禁用)。
作为 CPU 寄存器,PKRU 本质上是线程局部的,可能使每个线程拥有与其他所有线程不同的保护集。
Linux提供了3个对应的系统调用用于pkeys内存保护机制

基本用法:
1:在使用之前先调用pkey_alloc分配一个key。
2:然后调用pkey_mprotect
3:要修改该部分内存访问权限时,调用pkey_set
如下是一样例代码:

内存保护生效后,使用过程中违反了对应权限后,对于通过mprotect做保护的应用,程序会报SEGV_ACCERR错误,对于使用pkeys做保护的应用,程序报错SEGV_PKERR。