该copy_from_user()功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射?
copy_from_user()
的实现copy_from_user()高度依赖于体系结构。
在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将copy_from_user()代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错误copy_from_user()不会像其他任何进程上下文代码触发的那样杀死进程,也不会像在中断上下文中发生的那样使内核感到恐慌- 它只是在代码路径中恢复执行返回-EFAULT到呼叫者。
-EFAULT