用户空间可以使用GFP_USER处理kfree()内存吗?

时间:2014-11-13 16:45:58

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

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

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

2 个答案:

答案 0 :(得分:2)

不,用户空间无法释放内核内存。你的模块必须提供另一个调用/ ioctl,让用户空间告诉你的内核代码释放内存。您还必须跟踪您的分配以确保在用户空间进程退出时释放它们以免泄漏内存...内核内存也不可交换,如果用户空间让您一次又一次地分配内存它可以运行内核记忆所以你必须要防范这一点。

更简单的方法是让用户空间从其自己的内存中提供缓冲区。在调用中包含一个最大长度参数,这样您就不会写入超过用户空间期望的内容并返回部分数据,如果大小太小,则会发生错误。

答案 1 :(得分:1)

GFP_USER - 表示可以允许用户访问的内核空间内存(用作共享内核/用户页面的标记)。注意,进程可以睡眠/阻止并仅在进程上下文中运行。

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