我已经构建了一个字符驱动程序,我在其中使用dma_alloc_coherent()
分配两个PAGESIZE缓冲区
现在我正在通过这些BUFFER的物理地址[src_ptr& dest_ptr]使用ioctl()
作为source_offset
和dest_offset
的用户空间。
在用户空间中,此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);
}
我正在0x77
的用户空间&中写user_src_ptr
印花
用户空间中的user_src_ptr
和KERNEL空间中的dest_src_ptr
。
我获得了用户和内核空间的正确数据
我在内核空间中的0x55
写了dest_ptr
&打印dest_ptr
在内核空间和用户空间中的usr_dest_ptr
。
现在对于这种情况,我得到正确的数据,例如内核缓冲区中的0X55
dest_ptr
,但始终是目标的用户空间缓冲区
返回0x77
。即我写入usr_src_ptr
的数据。
如果我们可以在不同的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Јовић的输入....
答案 0 :(得分:1)
是的,正如您已经在示例中找到的那样,您可以在同一个进程中使用不同偏移的同一文件上执行mmap()。 man page for mmap(2)没有说明偏移限制(除了它必须是sysconf(_SC_PAGE_SIZE)返回的页面大小的倍数,并且当然它不应超出文件)。
只有one limit:当mmap()在一个进程中使用相同的文件时,您必须使用相同的文件ID。你在你的例子中做到了这一点,这就是它工作正常的原因。