LinuxÒÁµéÔ°ÂÛ̳'s Archiver

seven_007 ·¢±íÓÚ 2006-9-29 09:20

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]

seven_007 ·¢±íÓÚ 2006-9-30 08:39

ÔõôûÓÐÈ˻شðÄØ£¿ÎÒûÓÐÃèÊöÇå³þÂ¼±Ñ½¡£¡£¡£¡£

seven_007 ·¢±íÓÚ 2006-10-3 09:26

´ËÎÊÌâÒѾ­½â¾ö£¬Ê¹ÓÃnopage·½Ê½¡£
лл¸÷λµÄ¹Ø×¢¡£

Ò³: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.