如何避免linux设备驱动程序中的copy_from_user和copy_to_user

时间:2017-09-12 16:08:05

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

我正在编写一个设备驱动程序,它使用字符设备文件从用户空间缓冲区复制数据,该缓冲区是使用malloc分配给内核缓冲区的。目前使用copy_from_user api将用户数据复制到内核缓冲区。试图找到一种方法来避免用户和内核空间之间的数据复制。有没有办法在不使用malloc的情况下访问内核空间中的用户空间缓冲区(由copy_from_user分配)?

2 个答案:

答案 0 :(得分:3)

让我们回答您提出的问题。是的,您可以从内核访问由用户空间malloced的内存。我不确定如何进行技术细节,但如果您的内核代码在调用线程的上下文中运行,则可以简单地使用提供给您的用户空间指针。

但请不要这样做。

您不应该这样做的原因是,如果用户空间指针不好,或者内存太短,或者存在任何其他问题,则用户空间进程可能需要崩溃并出现分段错误。遗憾的是,您没有运行用户空间代码,而是运行内核空间。内核相当于分段错误是内核恐慌。不要对用户造成这种情况。

更好的方法是使用用户空间一次写入数据的机制,然后字符设备可以简单地使用它。在评论中提到了用户空间mmap页面。文件描述符工作方式可能更为标准的方法是在设备的fileops结构中实现splice_read

现在,splice不是一个易于使用的界面,但主要优点是如果你的源也能识别splice,用户可以直接从源传递数据到你的驱动程序,而不会通过用户空间。< / p>

如果您想保存副本,我建议您选择其中一种解决方案。再次,直接访问用户提供的指针,除非您知道自己在做什么。

答案 1 :(得分:0)

get_user_pages() API可用于固定用户页面从物理内存换出,内核可以通过访问相应虚拟地址的物理页面来访问此内存区域。