博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mprotect
阅读量:6194 次
发布时间:2019-06-21

本文共 3767 字,大约阅读时间需要 12 分钟。

mprotect - set protection on a region of memory

Synopsis

#include <>int mprotect(const void *addr, size_t len, int prot);

Description

mprotect() changes protection for the calling process's memory page(s) containing any part of the address range in the interval [addraddr+len-1]. addr must be aligned to a page boundary.

If the calling process tries to access memory in a manner that violates the protection, then the kernel generates a SIGSEGV signal for the process.

prot is either PROT_NONE or a bitwise-or of the other values in the following list:

PROT_NONE

The memory cannot be accessed at all.

PROT_READ

The memory can be read.

PROT_WRITE

The memory can be modified.

PROT_EXEC

The memory can be executed.

Return Value

On success, mprotect() returns zero. On error, -1 is returned, and errno is set appropriately.

Errors

EACCES

The memory cannot be given the specified access. This can happen, for example, if you (2) a file to which you have read-only access, then ask mprotect() to mark itPROT_WRITE.

EINVAL

addr is not a valid pointer, or not a multiple of the system page size.

ENOMEM

Internal kernel structures could not be allocated.

ENOMEM

Addresses in the range [addraddr+len-1] are invalid for the address space of the process, or specify one or more pages that are not mapped. (Before kernel 2.4.19, the errorEFAULT was incorrectly produced for these cases.)

Conforming To

SVr4, POSIX.1-2001. POSIX says that the behavior of mprotect() is unspecified if it is applied to a region of memory that was not obtained via (2).

Notes

On Linux it is always permissible to call mprotect() on any address in a process's 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. On some hardware architectures (e.g., i386), PROT_WRITEimplies PROT_READ.

POSIX.1-2001 says that an implementation may permit access other than that specified in prot, but at a minimum can only allow write access if PROT_WRITE has been set, and must not allow any access if PROT_NONE has been set.

Example

The program below allocates four pages of memory, makes the third of these pages read-only, and then executes a loop that walks upward through the allocated region modifying bytes.

An example of what we might see when running the program is the following:

$ ./a.outStart of region:        0x804c000Got SIGSEGV at address: 0x804e000

Program source

#include <>#include <>#include <>#include <>#include <>#include <>#include <>#define handle_error(msg) \    do { perror(msg); exit(EXIT_FAILURE); } while (0)char *buffer;static voidhandler(int sig, siginfo_t *si, void *unused){    printf("Got SIGSEGV at address: 0x%lx\n",            (long) si->si_addr);    exit(EXIT_FAILURE);}intmain(int argc, char *argv[]){    char *p;    int pagesize;    struct sigaction sa;   sa.sa_flags = SA_SIGINFO;    sigemptyset(&sa.sa_mask);    sa.sa_sigaction = handler;    if (sigaction(SIGSEGV, &sa, NULL) == -1)        handle_error("sigaction");   pagesize = sysconf(_SC_PAGE_SIZE);    if (pagesize == -1)        handle_error("sysconf");   /* Allocate a buffer aligned on a page boundary;       initial protection is PROT_READ | PROT_WRITE */   buffer = memalign(pagesize, 4 * pagesize);    if (buffer == NULL)        handle_error("memalign");   printf("Start of region:        0x%lx\n", (long) buffer);   if (mprotect(buffer + pagesize * 2, pagesize,                PROT_READ) == -1)        handle_error("mprotect");   for (p = buffer ; ; )        *(p++) = 'a';   printf("Loop completed\n");     /* Should never happen */    exit(EXIT_SUCCESS);}

转载于:https://www.cnblogs.com/justinyo/archive/2013/03/07/2948316.html

你可能感兴趣的文章
Linux启动过程笔记
查看>>
poj 3411 Paid Roads(dfs)
查看>>
SQL Server将数据导出到SQL脚本文件
查看>>
Win10下用Anaconda安装TensorFlow
查看>>
Google Maps Application Developing —— Quick Start
查看>>
PHP生成word的三种方式
查看>>
Iphone连轴画的实现
查看>>
Win7局域网打印机共享设置(详细图文流程)
查看>>
亿能测试资讯_2013-8-11
查看>>
为什么要使用AOP?
查看>>
Perl代码片段-正则表达式测试程序
查看>>
java路径Java开发中获得非Web项目的当前项目路径
查看>>
uva-442 Matrix Chain Multiplication
查看>>
(喷血分享)利用.NET生成数据库表的创建脚本,类似SqlServer编写表的CREATE语句...
查看>>
Beauty Contest
查看>>
[ACM_模拟] POJ1068 Parencodings (两种括号编码转化 规律 模拟)
查看>>
黑苹果收集
查看>>
【转】Struts2 和 Spring MVC对比
查看>>
【Hibernate步步为营】--继承映射具体解释
查看>>
Android -- ImageLoader简析
查看>>