我已经构建了一个字符驱动程序,在其中我使用分配两个 PAGESIZE 缓冲区
dma_alloc_coherent()
现在我使用
ioctl()
assource_offset
和将这些 BUFFER [src_ptr & dest_ptr] 的物理地址传递给用户空间dest_offset
。在用户空间中,此偏移量用作 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); }
我正在用户空间中写入
0x77
并在用户空间和内核空间中user_src_ptr
打印 。我得到了用户和内核空间的正确数据user_src_ptr
dest_src_ptr
我在内核空间中写入
0x55
并在 内核空间和用户空间中dest_ptr
打印。现在对于这种情况,我得到了正确的数据,例如在内核缓冲区 中,但目标的用户空间缓冲区总是返回。即我写入的数据。dest_ptr
usr_dest_ptr
0X55
dest_ptr
0x77
usr_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Јовић 您的意见....