Chinaunix首页 | 论坛 | 博客
  • 博客访问: 402828
  • 博文数量: 82
  • 博客积分: 2085
  • 博客等级: 大尉
  • 技术积分: 808
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-10 10:28
文章分类

全部博文(82)

文章存档

2014年(1)

2013年(4)

2012年(2)

2011年(3)

2010年(10)

2009年(36)

2008年(26)

我的朋友

分类: LINUX

2008-12-17 11:21:23

mmap()系统调用形式如下:

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )
参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot 参数指定共享内存的访问权限。可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。offset参数一般设为0,表示从文件头开始映射。参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。

 

例子:

#include
#include
#include
#include
#include
#define SIZE 800*600*2

int main(int argc, char** argv){
int fd;
unsigned char a;
long j;
unsigned char *pMem;
unsigned char *pTemp;

fd = open("/dev/fb0",O_RDWR);
if(fd<0){
 printf("open error%d\n",fd);
 return -1;
}

pMem = (unsigned char*) mmap(NULL, SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
if(pMem<0){
 printf("mmap error\n");
 return -1;
}
for(a = 0x00; a < 0xff; a++){
 pTemp = pMem;
 for(j = 0; j< SIZE; j++){
  *pTemp = a;
  pTemp++;
 }
 usleep(500000);
}

pTemp = NULL;
pMem = NULL;
munmap(pMem,SIZE);
close(fd);
return 0;
}

阅读(826) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~