红联Linux门户
Linux帮助

Linux的内存映像管理函数

发布时间:2012-04-08 16:00:22来源:红联作者:empast
内存映像的意思是把磁盘文件映像到内存中,以加速I/O操作和便于共享数据,而在共享数据时,为了避免多个进程同时读写数据引起不可预料的后果,通常使用锁或者信号灯等机制实现对共享对象的序列化访问。Linux提供了在sys/mman.h中定义的一系列内存映像管理的函数。

引用:
#include
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);


mmap把打开的磁盘文件fd从offset开始,映像到内存start处,大小为length。成功返回该映像的指针,失败返回-1并设置相应的errno。

映像可选的保护模式prot包括:PROT_NONE, PROT_READ, PROT_WRITE, PROT_EXEC等。

映像的可选属性flags包括:MAP_FIXED, MAP_PRIVATE, MAP_SHARED,MAP_ANON, MAP_DENYWRITE, MAP_GROWSDOWN, MAP_LOCKED等。

其中MAP_PRIVATE或者MAP_SHARED两者必须且只能选择一个,其它都是可选值,用逻辑或添加。MAP_FIXED强制使用start指定的地址,否则执行失败,如果没有使用这个选项,则mmap在start不可用时会尝试把mmap放到其它地方。MAP_LOCKED只用在root权限的进程才能使用,以防止锁定所有可用内存的恶意攻击。

引用:
#include
int munmap(void *start, size_t length);


munmap解除从start开始大小为length个字节的内存映像并释放内存,如果在munmap之后试图继续访问start,将会产生段错误。在进程终止运行时,所有的内存映像会被自动解除。

引用:
#include
int msync(const void *start, size_t length, int flags);


msync把从start开始的大小为length个字节的内存映像同步到磁盘,flags包括:MS_ASYNC, MS_SYNC, MS_INVALIDATE。成功返回0,失败返回-1并设置errno。

引用:
#include
int mprotect(const void *start, size_t len, int prot);


mprotect修改start开始的大小为len个字节的内存映像的保护模式为prot。成功返回0,失败返回-1并设置errno。

引用:
#include
int mlock(const void *start, size_t len);
int munlock(void *start, size_t len);
int mlockall(int flags);
int munlockall(void);


以上函数对指定的内存映像加锁和解锁,其中mlockall的flags包括MCL_CURRENT和MCL_FUTURE。只有root权限才能使用它们。

引用:
#include
void *mremap(void *old_addr, size_t old_len, size_t new_len, unsigned long flags);


mremap用指定的flags把地址在old_addr的内存映像大小从old_len调整为new_len,flags如果为MREMAP_MAYMOVE则调整此内存映像的地址。成功返回新地址,失败返回NULL。
文章评论

共有 0 条评论