现在的位置: 首页 > 综合 > 正文

用户内存空间映射mmap函数

2014年10月21日 ⁄ 综合 ⁄ 共 1014字 ⁄ 字号 评论关闭
用户内存空间映射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分配空间,即分配到进程的栈空间或者堆空间。

抱歉!评论已关闭.