虚拟内存操作
一、改变内存保护:mprotect()
此函数用于修改起始位置为addr
长度为length
字节的虚拟内存区域中分页上的保护。
#include<sys/mman.h>
int mprotect(void *addr,size_t length,int port);
//成功返回0,错误-1
- addr值必须是系统分页大小(
sysconf(_SC_PAGESIZE)
的返回值)的整数倍,且是分页对齐的。 - prot位掩码,指定内存区域上的新保护,取值是
PROT_NONE或PROT_READ、PROT_ERITE以及PROT_EXEC
这三个值中的一个或多个取OR。 - 进程访问内存区域时违背了内存保护,内核向进程发送
SIGSEGV
信号。
用途:修改原先通过mmap函数设置的映射内存区域上的保护。
例:使用mprotct修改内存保护。
#include<sys/mman.h>
#define LEN (1024 * 1024)
#define SHELL_FMT "cat /proc/%ld/maps | grep zero"
#define CMD_SIZE (sizeof(SHELL_FMT) + 20)
int main(int argc, char *argv[])
{
char cmd[CMD_SIZE];
char *addr;
/* 创建拒绝所有访问的匿名映射 */
addr = mmap(NULL, LEN, PROT_NONE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (addr == MAP_FAILED)
errExit("mmap");
/* 显示与映射对应的/proc/self/maps中的行 */
printf("Before mprotect()\n");
snprintf(cmd, CMD_SIZE, SHELL_FMT, (long) getpid());
system(cmd);
/*更改内存保护以允许读写访问*/
if (mprotect(addr, LEN, PROT_READ | PROT_WRITE) ==