【问题标题】:Can a userspace process kfree() memory with GFP_USER?用户空间可以使用 GFP_USER 处理 kfree() 内存吗?
【发布时间】:2015-01-10 21:36:43
【问题描述】:

我有一个内核模块来处理来自用户空间的 IOCTL 调用。其中一个调用需要将一个可变长度的缓冲区从内核返回到用户空间。从模块中,我可以kmalloc( ..., GFP_USER) 一个缓冲区供用户空间进程使用。但是,我的问题是,这个缓冲区可以从用户空间释放还是需要从内核空间释放?

或者,有没有更好的方法来处理可变长度数据的数据传输?

【问题讨论】:

  • 你不能以这种方式返回缓冲区; GFP_USER 做了不同的事情。

标签: memory linux-kernel kernel linux-device-driver


【解决方案1】:

不,用户空间不能释放内核内存。您的模块必须提供另一个 call / ioctl 让用户空间告诉您的内核代码释放内存。您还必须跟踪您的分配,以确保在用户空间进程退出时释放它们,以免泄漏内存......内核内存也是不可交换的,如果用户空间让您一次又一次地分配内存,它可能会耗尽内核内存,所以你也必须提防它。

更简单的方法是让用户空间从自己的内存中提供缓冲区。在调用中包含最大长度参数,这样您写入的内容不会超出用户空间的预期,并且如果大小太小,则返回部分数据或错误,视情况而定。

【讨论】:

    【解决方案2】:

    GFP_USER - 表示它是您可以允许用户访问的内核空间内存(用作共享内核/用户页面的标记)。请注意,进程只能在进程上下文中休眠/阻塞和运行。

    但是,在内核空间中分配的内存总是在内核空间中被释放,并且相对于用户空间而言。

    【讨论】:

      猜你喜欢
      • 2017-09-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      相关资源
      最近更新 更多