一尘不染

Linux内核中的copy_from_user如何在内部工作?

linux

copy_from_user()功能在内部如何工作?考虑到内核确实具有访问用户内存空间的特权,它是否使用任何缓冲区还是完成了任何内存映射?


阅读 358

收藏
2020-06-03

共1个答案

一尘不染

的实现copy_from_user()高度依赖于体系结构。

在x86和x86-64上,它只是直接从用户空间地址进行读取并写入内核空间地址,同时如果已配置,则暂时禁用SMAP(超级用户模式访问阻止)。它的棘手部分是将copy_from_user()代码放置在特殊区域中,以便页面错误处理程序可以识别其中何时发生错误。发生的内存保护错误copy_from_user()不会像其他任何进程上下文代码触发的那样杀死进程,也不会像在中断上下文中发生的那样使内核感到恐慌-
它只是在代码路径中恢复执行返回-EFAULT到呼叫者。

2020-06-03