为什么需要copy_to/from_user?

5 linux-kernel

根据x86和ppc上的linux设计,4g虚拟地址空间分为3:1.用户虚拟地址直到3g.

现在,如果用户应用程序执行ioctl传递指向缓冲区的指针,内核模块,可以直接执行memcpy,我尝试过它有效.=>为什么我们需要一个copy_to/copy_from用户.

注意:如果页面被换出,那么内核页面故障处理程序会将其返回,并且它对内核模块是不可见的.

需要你的想法...评论

caf*_*caf 9

copy_to_user/ copy_from_user使用正确的函数有几个很好的理由:

  • 在某些体系结构简单memcpy()没有工作,所以使用这些功能可以让你的代码在那里工作.我相信即使HIGHMEM选择配置选项的x86 也在这艘船上.

  • 这些函数进行access_ok()检查以确保引用的用户空间地址确实真正的用户空间地址.如果你只是做一个memcpy(),那么ioctl()can 的调用者可以提供一个与内核地址重叠的地址范围,这是一个安全漏洞.

  • 然而,主要的原因是为了妥善处理不好的用户地址.如果你只是使用裸机memcpy(),未处理的故障将导致内核oops.用户访问函数使用"fixup"机制,该机制允许处理错误(读取或写入很短,EFAULT在这种情况下通常返回到用户空间).