浅谈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()来关闭内存映射.

函数原型

接下来细说参数

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值