浅谈mprotect函数和mmap函数

mprotect函数

在Linux中,mprotect()函数可以用来修改一段指定内存区域的权限。

#include <unistd.h>   
#include <sys/mmap.h>   
int mprotect(const void *start, size_t len, int prot);

细说参数

一句话

mprotect()函数把自start开始的、长度为len的内存区的保护属性修改为prot指定的值。

注意几点:

指定的内存区间必须包含整个内存页
区间开始的地址start必须是一个内存页的起始地址
区间长度len必须是页大小的整数倍

 mmap函数

首先了解内存映射:

内存映射:(可以类别数学中函数的映射关系,抽象类比的理解这种关系或者说是过程)

将用户空间的一段内存区域映射内核空间

映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,

同样,内核空间对这段区域的修改也直接反映用户空间

通俗点理解嘛:就是你和镜子中的你,你发生什么改变,镜子里的你也发生同样的改变

现在假设镜子里的你可以被第三方改变(一定不是你),它被改变的同时,镜子外面的你也在被改变

好像穿越时空,历史的你被改变了,现在的你也就不复存在了

这样看来,双方改变是同时的

如果内核空间与用户空间两者之间需要大量数据传输,效率是很高的,因为它们同时在改变

具体步骤

用open系统调用打开文件, 并返回描述符fd.
用mmap建立内存映射, 并返回映射首地址指针start.
对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).
用munmap(void *start, size_t lenght)关闭内存映射.
用close系统调用关闭文件fd.

mmap函数是unix/linux下的系统调用

mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。

普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问

既然进程可以直接访问普通文件,就不需要再调用read()/write()等函数.

需要注意:

mmap没有分配空间, 只是将文件映射到调用进程的地址空间里,但是会占用 virutal memory, 然后就能对文件操作但是你刚操作结束,内存中的内容并不会立即更新到文件中,而是有一段时间的延迟,你可以调用msync()来显式同步一下, 这样你所写的内容就能立即保存到文件里了, 但是通过mmap来写文件这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了.如果想关闭内存映射,可以调用munmap()来关闭内存映射.

函数原型

接下来细说参数

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mprotect()是一个用于保护内存区域权限的系统调用函数。它可以用于更改内存区域的保护属性,如可读、可写、可执行等。当mprotect()函数被错误地使用时,可能会导致产生core文件。 在使用mprotect()函数时,可能会出现以下一些错误情况: 1. 内存区域无效:当尝试对一个无效的内存区域进行保护属性更改时,可能会导致产生core文件。无效的内存区域可能包括未映射的、未分配的或无效地址的内存区域。 2. 权限错误:当试图以无效的权限对内存区域进行保护属性更改时,也可能导致产生core文件。例如,如果尝试将一个不可写的内存区域设置为可写,或将一个不可执行的区域设置为可执行。 3. 内存操作冲突:如果在对内存区域进行保护属性更改的同时,该区域正在被其他操作使用(例如读取、写入或执行),可能会导致产生core文件。 当出现上述错误情况时,操作系统内核可能会捕获错误,并将错误信息写入core文件中。core文件是一种用于调试的文件,它包含在程序崩溃或产生其他异常情况时的程序状态和内存映像。通过分析core文件,开发者可以了解程序出错的位置和原因,从而进行调试和修复。 为了避免mprotect()产生core文件,开发者应该仔细检查每次调用mprotect()函数的参数,并确保内存区域和权限设置是合法和正确的。此外,还应注意在对内存区域进行保护属性更改时,避免其他操作对该区域产生冲突。合理使用mprotect()函数可以帮助提高程序的安全性和稳定性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值