发新话题
打印

linux2.6 mmap 的问题

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); // the get data is not 0x78, but
0
}
for(i=0;i<10000*10;i++);
for(i=0;i<256;i++)
  str = 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;
}
      

TOP

怎么没有人回答呢?我没有描述清楚嘛?急呀。。。。      

TOP

此问题已经解决,使用nopage方式。
谢谢各位的关注。      

TOP

发新话题