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

  2. 现在我使用ioctl()assource_offset和将这些 BUFFER [src_ptr & dest_ptr] 的物理地址传递给用户空间dest_offset

  3. 在用户空间中,此偏移量用作 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_ptrdest_src_ptr

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

谁能告诉我我们是否可以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Јовић 您的意见....

4

1 回答 1

1

是的,正如您在示例中已经发现的那样,您可以在同一进程中对具有不同偏移量的同一文件执行 mmap()。mmap(2)的手册页没有说明偏移限制(除了它必须是 sysconf(_SC_PAGE_SIZE) 返回的页面大小的倍数,当然它不应该超出文件)。


只有一个限制:当 mmap() 在一个进程中处理同一个文件时,您必须使用相同的文件 ID。您在示例中执行了此操作,这就是它运行良好的原因。

于 2013-01-29T12:30:13.503 回答