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()来关闭内存映射.
函数原型
接下来细说参数