您的位置:首页 > 其它

用户内存空间映射mmap函数

2014-07-30 19:17 344 查看
用户内存空间映射mmap函数
前面已经看到了,虚拟的用户内存空间可以有3G,这么大的空间,我们可以好好利用,
比如把某个文件装入到其中某个区域中,而不用在栈区分配空间来放入文件。
mmap函数就是干这个的。

原型:

#include<sys/mman.h>
void *mmap(void *start,size_t length,int prot,ing flags,int fd,off_t offset)

该函数就是把打开的文件映射到相应的进程空间的片虚拟内存区域,执行成功后,该函数返回这段映射区域的首地址。

start :即映射区域的首地址,如果为NULL,则表示让进程自己决定。
legnth:想要映射的文件大小(以字节位单位)
prot:这段区域的访问模式:PROT_EXEC(可执行)PROT_READ(可读)PROT_WRITE(可写)
flags:MAP_SHEAD表示这段区域可以被子进程共享,适用于共享内存
MAP_PRIVATE:私有的
fd:要映射的文件描述符

offset:文件的偏移。

例子:
#include <stdio.h>

#include <fcntl.h>

#include <sys/mman.h>

int main(int ac,char**av)

{

if(ac!=3)

{

printf("usage:startpage,endpage\n");

return -1;

}

int start_page=atoi(av[1]);

int end_page=atoi(av[2]);

int page=end_page-start_page;

int page_size=4*1024;

char *buff;

int fd,i;

if((fd=open("/dev/mem",O_RDONLY))<0)

{

printf("wrong open\n");

return -1;

}

if((buff=mmap(NULL,page*page_size,PROT_READ,MAP_SHARED,fd,start_page*page_size))==NULL)

{

printf("wrong mmap\n");

return -1;

}

for(i=0;i<page*page_size;i++)

printf("%x\t",buff[i]);

return 0;

}

在这里,把文件/dev/mem这个文件映射到了此进程的某个区域,且此区域只读。要是不这样的话,就得给buff分配空间,即分配到进程的栈空间或者堆空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: