Memory 用户空间能否使用GFP_用户处理kfree()内存?

Memory 用户空间能否使用GFP_用户处理kfree()内存?,memory,linux-kernel,kernel,linux-device-driver,Memory,Linux Kernel,Kernel,Linux Device Driver,我有一个内核模块处理来自用户空间的IOCTL调用。其中一个调用需要将一个可变长度的缓冲区从内核返回到用户空间。从模块中,我可以kmalloc(…,GFP\u USER)为用户空间进程使用一个缓冲区。但是,我的问题是,这个缓冲区可以从用户空间中释放出来,还是需要从内核空间中释放出来 或者,有没有更好的方法来处理可变长度数据的数据传输?没有,用户空间无法释放内核内存。您的模块必须提供另一个调用/ioctl,让用户空间告诉内核代码释放内存。您还必须跟踪您的分配,以确保在用户空间进程退出时释放它们,以避

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


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

没有,用户空间无法释放内核内存。您的模块必须提供另一个调用/ioctl,让用户空间告诉内核代码释放内存。您还必须跟踪您的分配,以确保在用户空间进程退出时释放它们,以避免内存泄漏……此外,内核内存是不可交换的,如果用户空间让您一次又一次地分配内存,那么内核可能会耗尽内存,因此您也必须对此加以防范


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

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


然而,在内核空间中分配的内存总是在内核空间中释放,而在用户空间中释放

您不能以这种方式返回缓冲区<代码>GFP_用户做了一些不同的事情。