linux2.6 mmap µÄÎÊÌâ
ÎÊÌâÏÖÏó£ºÓû§³ÌÐòmmapÇý¶¯³ÌÐòµÄÒ»¿ébufºó£¬¶Á²»µ½´ËbufÖеÄÊý¾Ý£¨³õʼ»¯Ê±ºòÉèÖÃ
0x78£©£¬µ±Óû§³ÌÐò¸ü¸ÄÁË´ËbufµÄÄÚÈÝ£¬Çý¶¯³ÌÐò¶Á³öÀ´µÄÊý¾Ý»¹ÊÇÒ»¿ªÊ¼³õʼ
»¯ÉèÖõÄÊý¾Ý(0x78)£¬Ã»Óиıä¹ý¡£
ºóÀ´»³ÒÉÊÇmmap()µ÷ÓõÄÊôÐÔ(MAP_PRIVATE)²»¶Ô£¬¸Ä³ÉMAP_SHARED£¬ÔÚµ÷ÓÃmmap
µÄʱºò¾ÓÈ»ÏÔʾmmap() Permission denied
Çë¸÷λ´óÏÀ°ï°ïæ¡£
³ÌÐòÔ´Â룺
£££££££££££££££ÄÚºË̬´úÂ룣£££££££££££££
void *H264InputBuf =NULL;
static int h264_open(struct inode *inode, struct file *filp)
{
if((H264InputBuf = kmalloc(MAXNALBUFNUM*MAXNALLENGTH,
GFP_KERNEL)) != NULL) //initialize one 2*64k buffer
{
memset(H264InputBuf, 0x78, 512); //initialize it as
0x78
}
else
{
printk("!!!!!!!!ERROR: H264 kmalloc failure ... \n");
return -1;
}
printk("addr = 0x%x\n",(unsigned long)H264InputBuf);
return 0;
}
static int h264_mmap (struct file *file, struct vm_area_struct *vma)
{
unsigned long page,pos;
unsigned long start = (unsigned long)vma->vm_start;
unsigned long size = (unsigned long)(vma->vm_end-vma-
>vm_start);
printk("h264_mmap, start:%x,end:%x,size:%x\n",vma->vm_start,
vma->vm_end, size);
if(size > MAXNALBUFNUM*MAXNALLENGTH)
return -1;
printk("1 prot: 0x%x\n",(vma->vm_page_prot));
//vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
//printk("2 prot: 0x%x\n",(vma->vm_page_prot));
pos=(unsigned long) H264InputBuf;
page = virt_to_phys((void *)pos);
printk("pos addr:%x, phyaddr:%x\n",pos,page);
if (remap_page_range( vma,
vma->vm_start, //Virtual addr
page, //Physical addr
vma->vm_end - vma->vm_start, //size
vma->vm_page_prot //
) != 0)
{
return -EAGAIN;
}
//printk("h264_mmap success\n");
return 0;
}
£££££££££££££££Óû§Ì¬´úÂ룣££££££££££££
int H264Start(void)
{
int ret = 0, i=0, len = 256;
char *str = NULL;
//1, open device
if((_dev_h264_fd = open("/dev/misc/H264", O_RDONLY)) == -1)
{
return -1;
}
//2, mmap
str = (char *)mmap(NULL,MAXNALBUFNUM * MAXNALLENGTH,PROT_READ |
PROT_WRITE, MAP_PRIVATE,_dev_h264_fd,0);
if(str == MAP_FAILED)
{
printf("mmap error = %d\n",errno);
perror("h264mmap ");
return -1;
}
printf("straddr=0x%x\n",(unsigned long)str);
//3, Get and wirte data to share memory and inform driver
printf("Get old value=");
for(i=0;i<=256;i++)
{
if(i%8==0)
printf("\n");
printf("%x, ",str[i]); // the get data is not 0x78, but
0
}
for(i=0;i<10000*10;i++);
for(i=0;i<256;i++)
str[i] = i;
//4, demmap share memroy
munmap(str,MAXNALBUFNUM * MAXNALLENGTH);
return 0;
}
void H264Exit(void)
{
if(_dev_h264_fd)
{
close(_dev_h264_fd);
_dev_h264_fd = 0;
}
}
int main(int argc, char *argv[])
{
H264Start();
H264Exit();
return 0;
}
[size=3][size=3][/size][/size] ÔõôûÓÐÈ˻شðÄØ£¿ÎÒûÓÐÃèÊöÇå³þÂ¼±Ñ½¡£¡£¡£¡£ ´ËÎÊÌâÒѾ½â¾ö£¬Ê¹ÓÃnopage·½Ê½¡£
лл¸÷λµÄ¹Ø×¢¡£
Ò³:
[1]