mprotect()函数 Unix/Linux
2016-05-28 14:31
741 查看
mprotect - 控制允许访问的内存区域
内容简介
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
The function mprotect()
specifies the desired protection for the memory page(s) containing part or all of the interval [addr,addr+len-1].
If an access is disallowed by the protection given it, the program receives a SIGSEGV.
prot is a bitwise-or of the following values:
The new protection replaces any existing protection. For example, if the memory had previously been marked PROT_READ,
and mprotect() is then called with protPROT_WRITE,
it will no longer be readable.
On success, mprotect()
returns zero. On error, -1 is returned, and errno is
set appropriately.
SVr4, POSIX.1-2001. POSIX says that mprotect()
can be used only on regions of memory obtained from mmap(2).
On Linux it is always legal to call mprotect()
on any address in a process’ address space (except for the kernel vsyscall area). In particular it can be used to change existing code mappings to be writable.
Whether PROT_EXEC has any effect different from PROT_READ is
architecture and kernel version dependent.
内容简介
#include <sys/mman.h>
int mprotect(const void *addr, size_t len, int prot);
描述
The function mprotect()specifies the desired protection for the memory page(s) containing part or all of the interval [addr,addr+len-1].
If an access is disallowed by the protection given it, the program receives a SIGSEGV.
prot is a bitwise-or of the following values:
标签 | 描述 |
---|---|
PROT_NONE | The memory cannot be accessed at all. |
PROT_READ | The memory can be read. |
PROT_WRITE | The memory can be written to. |
PROT_EXEC | The memory can contain executing code. |
and mprotect() is then called with protPROT_WRITE,
it will no longer be readable.
返回值
On success, mprotect()returns zero. On error, -1 is returned, and errno is
set appropriately.
错误
标签 | 描述 |
---|---|
EACCES | The memory cannot be given the specified access. This can happen, for example, if you mmap(2) a file to which you have read-only access, then ask mprotect() to mark it PROT_WRITE. |
EFAULT | The memory cannot be accessed. |
EINVAL | addr is not a valid pointer, or not a multiple of PAGESIZE. |
ENOMEM | Internal kernel structures could not be allocated. Or: addresses in the range [addr, addr+len] are invalid for the address space of the process, or specify one or more pages that are not mapped. |
#include <stdlib.h> #include <errno.h> #include <sys/mman.h> #include #include #include #include #include /* for PAGESIZE */ #ifndef PAGESIZE #define PAGESIZE 4096 #endif int main(void) { char *p; char c; /* Allocate a buffer; it will have the default protection of PROT_READ|PROT_WRITE. */ p = malloc(1024+PAGESIZE-1); if (!p) { perror("Couldn’t malloc(1024)"); exit(errno); } /* Align to a multiple of PAGESIZE, assumed to be a power of two */ p = (char *)(((int) p + PAGESIZE-1) & ~(PAGESIZE-1)); c = p[666]; /* Read; ok */ p[666] = 42; /* Write; ok */ /* Mark the buffer read-only. */ if (mprotect(p, 1024, PROT_READ)) { perror("Couldn’t mprotect"); exit(errno); } c = p[666]; /* Read; ok */ p[666] = 42; /* Write; program dies on SIGSEGV */ exit(0); }
遵循于
SVr4, POSIX.1-2001. POSIX says that mprotect()can be used only on regions of memory obtained from mmap(2).
注意
On Linux it is always legal to call mprotect()on any address in a process’ address space (except for the kernel vsyscall area). In particular it can be used to change existing code mappings to be writable.
Whether PROT_EXEC has any effect different from PROT_READ is
architecture and kernel version dependent.
相关文章推荐
- Linux定时任务Crontab使用 提示no crontab for root
- Linux中常用的查询指令(which、whereis、find、locatae)
- Centos 6.4 iptables防火墙关闭启动详解
- linux的操作和配置 (centos 6.7)
- Centos 开放80端口
- 脚本之家--关于linux的资源
- Linux/Unix 桌面趣事:文字模式下的 ASCII 艺术与注释绘画
- Linux套接字实现服务器和客户端通信
- mpi4py在MPICH2上的安装
- 远程连接腾讯云Centos系统的MySQL数据库
- linux下jiffies定时器和hrtimer高精度定时器
- CentOS 6.2下搭建Web服务器
- linux下namp简单使用
- 一顿好找。。。Kali linux( debian系 linux) Qt5 安装qt designer
- linux进程间通信之无名管道通信学习笔记
- 给kali linux2.0装一个中文输入法
- centos7安装eclipse
- centos6.7更换源
- L-1-2 Linux基础命令详解之系统操作指令
- centos mysql开启远程访问