根据x86和ppc上的linux设计,4g虚拟地址空间分为3:1.用户虚拟地址直到3g.
现在,如果用户应用程序执行ioctl传递指向缓冲区的指针,内核模块,可以直接执行memcpy,我尝试过它有效.=>为什么我们需要一个copy_to/copy_from用户.
注意:如果页面被换出,那么内核页面故障处理程序会将其返回,并且它对内核模块是不可见的.
需要你的想法...评论
copy_to_user/ copy_from_user使用正确的函数有几个很好的理由:
在某些体系结构简单memcpy()并没有工作,所以使用这些功能可以让你的代码在那里工作.我相信即使HIGHMEM选择配置选项的x86 也在这艘船上.
这些函数进行access_ok()检查以确保引用的用户空间地址确实是真正的用户空间地址.如果你只是做一个memcpy(),那么ioctl()can 的调用者可以提供一个与内核地址重叠的地址范围,这是一个安全漏洞.
然而,主要的原因是为了妥善处理不好的用户地址.如果你只是使用裸机memcpy(),未处理的故障将导致内核oops.用户访问函数使用"fixup"机制,该机制允许处理错误(读取或写入很短,EFAULT在这种情况下通常返回到用户空间).