- 论坛徽章:
- 0
|
问题现象:
用户程序mmap驱动程序的一块buf后,读不到此buf中的数据(初始化时候设置0x78),当用户程序更改了此buf的内容,驱动程序读出来的数据还是一开始初始化设置的数据(0x7 ,没有改变过。
后来怀疑是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;
} |
|