内存映射函数mmap

时间:2022-09-04 18:45:21
内存映射:把系统空间里面的内容与用户空间共享,提高用户操作设备的效率。 头文件:     #include <sys/mmap.h>
映射函数原型:  void *mmap(    void *addr,   ---》要映射到内存的那一个地址上  填写为NULL让系统自动分配         size_t length,  ---》要映射的空间大小         int prot,   ---》映射空间的权限  PROT_EXEC  Pages may be executed.可执行        PROT_READ  Pages may be read.    可读         PROT_WRITE Pages may be written. 可写                 PROT_NONE  Pages may not be accessed.没有权限
         int flags,     ---》其他进程对改空间的访问权限   MAP_SHARED  -》其他进程可访问改内存           MAP_PRIVATE  -》该空间为私有的,其他进程不可访问                          int fd,      ---》需要映射的设备描述符          off_t offset );->映射空间的偏移量  0不偏移
返回值:成功返回映射空间的首地址,失败返回NULL ---------------------------------------------------------------------------- 解除映射空间 函数原型:     int munmap(void *addr,,size_t length);
参数一:需要解除映射的首地址 参数二:需要解除的长度 返回值:成功返回0,失败返回-1
-------------------------------------------------------------------------------------------- mmap函数在嵌入式开发板中的使用
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
int main()
{
//打开LCD设备
int fd=open("/dev/fb0",O_RDWR);
if(fd<0)
{
perror("lcd:");
}
//获取LCD屏幕属性
struct fb_var_screeninfo lcdmsg;
int ret=ioctl(fd,FBIOGET_VSCREENINFO,&lcdmsg);
if(ret==0)
{
printf("lcd x=%d,y=%d,bit=%d\n",lcdmsg.xres,lcdmsg.yres,lcdmsg.bits_per_pixel);
}
//获取字节的大小
int c= lcdmsg.bits_per_pixel/8;
//对LCD设备空间进行映射
unsigned int *lcd=mmap(NULL,lcdmsg.xres*lcdmsg.yres*c,PROT_READ|PROT_WRITE, MAP_SHARED,fd,0);
if(*(int *)lcd==-1)
{
perror("mmap lcd fail:");
}
//对LCD屏幕进行操作
int i=0,j=0;
for(i=0;i<480;i++)
{
for(j=0;j<800;j++)
{
*(lcd+i*800+j) = 0x00ff00;
}
}
close(fd);
return 0;
}