代码之家  ›  专栏  ›  技术社区  ›  Methos

从内核线程为用户空间分配内存

  •  5
  • Methos  · 技术社区  · 15 年前

    我的问题是将数据从内核传递到用户空间程序。我想实现一个系统调用“get_data(size,char*buff,char**meta_-buf)”。在这个调用中,buff由用户空间程序分配,其长度在size参数中传递。然而,meta_buf是一个可变长度的缓冲区,由内核分配(在用户空间程序的vm页面中)并填充。用户空间计划将释放此区域。

    (我无法在用户空间中分配数据,因为用户空间程序不知道meta_buff的大小。此外,用户空间程序无法分配固定数量的内存并反复调用系统调用来读取整个元数据。meta_数据必须在一次系统调用中返回)

    1. (如果您能给我指出任何其他执行类似操作的系统调用,我将不胜感激——在内核中分配,在用户空间中释放)
    1 回复  |  直到 7 年前
        1
  •  12
  •   bdonlan    15 年前

    不要试图从内核为用户空间分配内存——这严重违反了内核的抽象层。相反,考虑一些其他的选择:

    • 让用户空间询问它需要多少空间。用户空间分配内存,然后从内核获取内存。
    • 设置所需数据量的上限。就分配那么多吧。

    为什么? 这必须是原子的。实际上,内存的分配无论如何都需要是可中断的(或者你不太可能成功),所以离开和回到内核不会造成太大的伤害。事实上 写入用户空间内存 必须 可中断,因为可能会出现需要IO的页面错误。