免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1115 | 回复: 2
打印 上一主题 下一主题

请教linux2.6 mmap 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-29 10:41 |只看该作者 |倒序浏览
问题现象:
用户程序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;
}

论坛徽章:
0
2 [报告]
发表于 2006-09-30 08:34 |只看该作者
怎么没有人回答呀?是我没有描述清楚还是...?急呀。

论坛徽章:
0
3 [报告]
发表于 2006-10-03 09:20 |只看该作者
此问题已经解决,使用nopage方式。
谢谢各位的关注。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP