免费注册 查看新帖 |

Chinaunix

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

mmap问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-10 15:51 |只看该作者 |倒序浏览
我在驱动中申请片连续的物理内存,然后通过nopage的方法实现mmap
驱动:

(1).申请内存
char* buf = (char *)__get_free_pages(GFP_KERNEL, 4);
(2)实现驱动mmap
static int mmap_mem(struct file * file, struct vm_area_struct * vma)

vma->vm_ops = &mmap_mem_ops;
return 0;

(3)实现vma的fault
static int mmap_mem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
{
        unsigned long offset;
          unsigned long kern_addr;
                unsigned long address = ( unsigned long)vmf->virtual_address;

          offset = address - vma->vm_start + (vma->vm_pgoff<<PAGE_SHIFT);
           kern_addr= (unsigned long)(&buf[offset]);
          if (kern_addr == 0UL)
        {
                vmf->page = (struct page *)NULL;
                return -1;
        }

        atomic_inc(&(virt_to_page((void *)kern_addr)->_count));

        vmf->page = virt_to_page((void *)kern_addr);

           return 0;
}

用户程序:
int main(int argc ,char* argv[])
{
        int fd1,fd2;
        int i=0;
        if(argc!=2)
        {
                printf("usage: %s  filename\n",argv[0]);       
                exit(-1);       
        }       
       
        if((fd1=open("/dev/mem",O_RDWR))<0)  //open device node
        {
                printf("open /dev/mem error\n");
                exit(-1);
        }
       
        void* fp = mmap(0, 1024*64, PROT_READ|PROT_WRITE, MAP_SHARED,fd1, 0);
        printf("fp:%x\n",fp);
       
        if((fd2 = open(argv[1],O_RDONLY|O_DIRECT))<0)
        {
                printf("open :%s error\n",argv[1]);
                exit(1);       
        }

        while(1){
                i=read(fd2,fp,64*1024);
                if(i<0){
                        printf("direct io read error:%d\n",i);
                        break;
                }               

          if(i!=64*1024)
                  break;
        }
       
        munmap(fp,64*1024);
       
        close(fd2);
        close(fd1);
        return 0;       
}

用户程序第一次可以正常运行,
第二次运行时候出现:Unhandled kernel unaligned access[#1]:

内核版本:2.6.27,mips

谢谢

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2010-07-10 16:28 |只看该作者
其实可以把你申请内存的物理地址传给用户空间,然后在用户空间执行mmap操作。

论坛徽章:
0
3 [报告]
发表于 2010-07-11 18:29 |只看该作者
回复 2# Godbach


    主要是我需要自己实现mmap方法,当然把物理地址传给用户程序,mmap mem设备也是可以了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2010-07-12 07:59 |只看该作者
第二次运行时候出现:Unhandled kernel unaligned access[#1]:

这个错误提示感觉应该是内存地址对齐的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP