用户内存空间映射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分配空间,即分配到进程的栈空间或者堆空间。
用户内存空间映射mmap函数
最新推荐文章于 2019-06-07 11:30:21 发布