C 编程/POSIX 参考/sys/mman.h/mprotect
在类似 Unix 的操作系统中,mprotect() 是一个 POSIX 系统调用,用于控制内存保护。它设置内存映射的保护。mprotect 函数更改由 prot 指定的访问保护。
在 'mprotect' 这个词中,'m' 代表内存,'protect' 代表保护,所以 mprotect 基本上代表内存保护。mprotect() 是一种保护类型的函数。它的工作原理基于 prot。Prot 只是一个参数。mprotect 提供了对 prot 指定的访问保护。Prot 是决定允许哪种访问类型的参数。访问可以是只读、写入、执行,甚至是一些组合。但是,参数 prot 的参数强制设置为 PROT_READ 或者 PROT_READ、PROT_EXEC 和 PROT_WRITE 中的一个或多个。对未由 prot 指定的访问也允许;但 PROT_WRITE 和 PROT_NONE 的情况有所不同。当未设置 PROT_WRITE 时,不允许写入成功。此外,当单独设置 PROT_NONE 而没有其他设置时,不允许访问。
以下 prot 的值可以实现:- PROT_NONE、PROT_READ、PROT_WRITE,以及 PROT_READ 和 PROT_WRITE 的按位或组合
如果 mprotect 失败,并且错误不是 EINVAL,则表示保护范围(addr,addr + len)发生了更改。
要使用 mprotect 函数,需要包含 'sys/mman.h' 头文件。
int mprotect(void *addr, size_t len, int prot);
addr : 将开始保护的内存范围的起始地址。
len : 受保护的地址范围的长度,以字节为单位。
prot : 保护标志,可以是 PROT_NONE 或者 PROT_READ、PROT_WRITE 和 PROT_EXEC 的按位或组合。
每个保护标志都有特殊的含义
- PROT_NONE : 内存无法以任何方式访问。
- PROT_READ : 可以读取内存中的数据。
- PROT_WRITE : 可以通过写入修改数据。
- PROT_EXEC : 可以执行内存中的数据。
以下是由于以下原因导致 mprotect() 函数失败的常见错误:-
- EACCES
- EAGAIN
- EINVAL
- ENOMEM
- ENOMEM
- ENOTSUP
成功完成时,mprotect() 返回 0。否则,返回 -1 并设置 errno 以指示错误。
- http://pubs.opengroup.org/onlinepubs/7908799/xsh/mprotect.html
- mprotect — 设置内存映射的保护(The Open Group Base Specifications Issue 6, IEEE Std 1003.1)
- FreeBSD 7.1 mprotect 手册页
- HP-UX 11i 参考说明
- Solaris 10 参考说明