【问题标题】:mmap only needed pages of kernel buffer to user spacemmap 只需要内核缓冲区的页面到用户空间
【发布时间】: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


【解决方案1】:

你想要做的已经可以通过调用mmapMAP_ANONYMOUS来实现。

或者,在/dev/zero 上致电mmap

【讨论】:

  • 谢谢,但我无法修改用户空间程序。
  • 但是你能做一个到/dev/zero的符号链接吗?
  • 我确实能够创建到 /dev/zero 的符号链接。我应该如何进一步进行?
  • 程序正在寻找一些 /dev/uiox 设备,我可以让它指向 /dev/zero。但是,如果程序 mmap() 是文件(即 /dev/zero),它就不需要那么多内存来分配吗? mmap() 是否只按需分配页面?而且,如果是的话,我如何在我的 vmf->fault() 方法中模拟相同的行为?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
相关资源
最近更新 更多