Linux内存保护机制

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。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如果你看完书中的所有例子,你很可能已经做完你的实验和在已经越狱的iPhone上的研究。因为和许多人一样,几乎所有的...
    fishmai0阅读 17,188评论 2 42
  • 一、前言 在 Linux设备驱动 中,内存使用 是一个逃不掉的话题。Linux内核 的内存管理庞大且复杂,要想理解...
    wipping的技术小栈阅读 10,099评论 0 3
  • 前言 最近在学习Linux内核,读到《深入理解Linux内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了...
    Yonah潇阅读 5,148评论 0 3
  • 参考:https://www.anquanke.com/post/id/208364%5C[https://www...
    that_is_this阅读 4,688评论 0 1
  • 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空...
    要上班的斌哥阅读 16,578评论 2 55

友情链接更多精彩内容