【发布时间】:2013-06-26 19:19:23
【问题描述】:
另请参阅此答案:https://stackoverflow.com/a/10770582/1284631
我需要类似的东西,但不必分配缓冲区:理论上缓冲区很大,但用户空间程序只需要访问其中的某些部分,因此页面数量有限。
问题是:
my_vm_ops.fault() 方法的主体是什么以及通过vmf->page 返回哪个页面? (它需要分配所需的页面,而不是来自预先存在的缓冲区)
【问题讨论】:
-
如果不分配缓冲区,它从哪里来?
-
@CL。好吧,这个想法是只分配被要求的页面。您是否建议对于每个页面错误我应该创建一个带有恰好一个 PAGE_SIZE 的 vmalloc_user() 的缓冲区,然后将该页面返回到 vmf->page 字段?基本上,my_fault() 函数应该是这样的: {void *my_buf = vmalloc_user(PAGE_SIZE); vmf->page=vmalloc_to_page(my_buf); get_page(vmf->page);} ?那么如何处理 vmf->pgoff 呢?它还有什么意义吗? PS谢谢。
-
@CL。我认为这确实是答案: static int my_fault(struct vm_area_struct *vma, struct vm_fault *vmf){void *my_buf = vmalloc_user(PAGE_SIZE); vmf->page=vmalloc_to_page(my_buf); vmf->page=get_page(vmf->page);}。你能确认一下吗?返回0; }
-
你需要什么样的内存?为什么应用不能分配?
-
@CL。它是嵌入式 Linux:没有交换空间,只有 1GB 的 RAM。我需要伪造(虚拟化)分布在 256 MB RAM 上的内存/寄存器,我根本没有空间。有没有什么方法可以 get_page() 一个页面只有在以前没有分配的情况下?
标签: linux-kernel linux-device-driver mmap