存储映射IO

2015-02-16 16:02:25   最后更新: 2015-02-16 16:02:25   访问数量:673




存储映射 IO 使一个磁盘文件与存储空间中的一个缓冲区想映射,于是当从缓冲区中取数据时,就相当于读文件中的相应字节,同样,将数据写入缓冲区则相应字节被自动写入文件,这样就可以在不使用 read 和 write 的情况下执行 IO 操作了

 

mmap 函数用来声明一个映射,即告知内核将一个给定的文件映射到一个存储区域中

void *mmap(void *addr, size_t len, int prot, int flag, int filedes, off_t off);

 

定义于 sys/mman.h 中

调用成功返回映射区域的首地址,否则返回 MAP_FAILED

 

addr

addr 参数用于指定映射存储区的起始地址,如果设为 0,则由系统选择该映射区的起始地址

 

len

映射字节数

 

off

要映射字节在文件中的起始偏移量

通常应当是系统虚存页表长度的倍数

虚存页表长度可以通过 _SC_PAGESIZE 或 _SC_PAGE_SIZE 参数调用 sysconf 函数获取

 

filedes

被映射文件的文件描述符

 

prot

对映射存储区的保护要求

映射存储区的保护要求
prot说明
PROT_READ映射区可读
PROT_WRITE映射区可写
PROT_EXEC映射区可执行
PROT_NONE映射区不可访问

 

调用中,可以指定为 PROT_NONE 或者 PROT_READ、PROT_WRITE、PROT_EXEC 的任意组合的按位或

但是,需要注意的是,对指定映射存储区的保护要求不能超过文件 open 模式访问权限,如某文件是只读打开,则对映射存储区就不能指定 PROT_WRITE

 

flag

flag 参数取值
取值意义
MAP_FIXED返回值必须与 addr 参数相等,不推荐使用,如果未指定此标志,而 addr 为非 0 值,则内核只将 addr 参数视为起始地址的建议值,实际起始地址以函数返回值为准
MAP_SHARED将对映射区的存储操作视为对该文件的 write 操作
MAP_PRIVATE对映射区的存储操作将会创建原始文件的私有副本,此后所有的操作都将在该副本的基础上进行读写,不会影响原文件

 

MAP_SHARED 与 MAP_PRIVATE 两个标志必须指定其中的一个,但是不能同时指定

 

mmap 与信号 -- SIGSEGV & SIGBUS

当进程试图访问对它不可用的存储区时,会抛出 SIGSEGV 信号

如果进程访问的存储区不存在,则抛出 SIGBUS 信号

 

int mprotect(void *addr, size_t len, int prot);

 

定义于 sys/mman.h 中

调用成功返回 0,否则返回 -1

 

int msync(void *addr, size_t len, int flags);

 

定义于 sys/mman.h 中

调用成功返回 0,否则返回 -1

 

如果是通过 MAP_PRIVATE 标志创建的缓存,则调用 msync 不会改变文件内容

 

flags 参数

必须取值 MS_ASYNC 或 MS_SYNC 中的一个

msync 的 flags 参数
取值意义
MS_ASYNC简化被写页的调度
MS_SYNC返回之前等待写操作完成
MS_INVALIDATE可选,丢弃与底层存储器没有同步的任何页

 

int munmap(caddr_t addr, size_t len);

 

定义于 sys/mman.h 中

调用成功返回 0,否则返回 -1

 

munmap 不会影响被映射对象,即 munmap 函数不会将映射区内容写到磁盘文件上

 






读书笔记      技术帖      龙潭书斋      apue      unix环境高级编程      io      memory      存储      高级io      mmap      msync      munmap      mprotect     


京ICP备15018585号