我们可以在同一个/ dev文件上使用两个MMAP

时间:2013-01-29 11:35:22

标签: linux mmap

  1. 我已经构建了一个字符驱动程序,我在其中使用dma_alloc_coherent()分配两个PAGESIZE缓冲区

  2. 现在我正在通过这些BUFFER的物理地址[src_ptr& dest_ptr]使用ioctl()作为source_offsetdest_offset的用户空间。

  3. 在用户空间中,此offeset用作mmap调用的偏移量。 所以在同一个/ dev文件中说/ dev / 250我正在进行两次MMAP调用

    usr_src_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE, 
                                   MAP_SHARED,dev_FD,
                                   src_offset );    
    
    if (usr_src_ptr == MAP_FAILED){
    printf("USR[UPP]:SOURCE MMAP FAiled \n\n");
        close(dev_FD);
        exit(-1);   
    }else{
        printf("USR[UPP]:SOURCE MMAP is %X..\n",usr_src_ptr);
    }
    
    usr_dest_ptr= mmap(0,page_size, PROT_READ|PROT_WRITE,MAP_SHARED,
                                    dev_FD,dest_offset );       
    if (usr_dest_ptr == MAP_FAILED){
         printf("USR[UPP]:DEST MMAP FAiled \n\n");
        close(dev_FD);
        exit(-1);   
    }else{
        printf("USR[UPP]:DEST MMAP is %X..\n",usr_dest_ptr);
    }
    
  4. 我正在0x77的用户空间&中写user_src_ptr印花 用户空间中的user_src_ptr和KERNEL空间中的dest_src_ptr。 我获得了用户和内核空间的正确数据

  5. 我在内核空间中的0x55写了dest_ptr&打印dest_ptr 在内核空间和用户空间中的usr_dest_ptr。 现在对于这种情况,我得到正确的数据,例如内核缓冲区中的0X55 dest_ptr,但始终是目标的用户空间缓冲区 返回0x77。即我写入usr_src_ptr的数据。

  6. 如果我们可以在不同的OFFSET上对同一个文件进行两次mmap()操作,请问任何人吗?


    而不是:

    if ((ret = remap_pfn_range(vma,vma->vm_start,
                              (virt_to_phys((void *)src_ptr) >> PAGE_SHIFT),
                              size,vma->vm_page_prot)) < 0)  return ret;  
    

    正确的是:

    if ((ret = remap_pfn_range(vma,vma->vm_start,
                               vma->vm_pgoff,
                               size,vma->vm_page_prot)) < 0)
    

    感谢BЈовић的输入....

1 个答案:

答案 0 :(得分:1)

是的,正如您已经在示例中找到的那样,您可以在同一个进程中使用不同偏移的同一文件上执行mmap()。 man page for mmap(2)没有说明偏移限制(除了它必须是sysconf(_SC_PAGE_SIZE)返回的页面大小的倍数,并且当然它不应超出文件)。


只有one limit:当mmap()在一个进程中使用相同的文件时,您必须使用相同的文件ID。你在你的例子中做到了这一点,这就是它工作正常的原因。