当内核映射到与进程本身相同的虚拟地址空间时,为什么需要“copy_from_user()”和“copy_to_user()”?

当内核映射到与进程本身相同的虚拟地址空间时,为什么需要“copy_from_user()”和“copy_to_user()”?

当内核映射到与进程本身相同的虚拟地址空间时,为什么需要copy_from_user()它?copy_to_user()

为了学习目的开发了一些(玩具)内核模块后,我很快就意识到了这一点,copy_from_user()并且copy_to_user()需要将数据从用户空间缓冲区复制到用户空间缓冲区;否则与无效地址相关的错误会导致崩溃。

但是,如果0x1fffff虚拟地址指向用户空间缓冲区,那么为什么该地址在内核中无效?内核位于相同的虚拟地址空间中,因此0x1fffff将映射到相同的物理内存。

在此输入图像描述

在此输入图像描述

答案1

地址空间映射在某些(不是全部!)架构上是相同的,但即使在它们相同的架构上,保护级别也不同。copy_from_user等服务于三个主要目的:

  • 他们检查要读取或写入的内存的权限是否允许在用户空间中运行的进程读取或写入它 - 这确保进程不能欺骗内核访问进程不应该访问的内存能够;
  • 它们允许特定的错误处理,以便保护错误不会使内核崩溃,例如,如果当前未映射请求的地址(考虑零页或换出页);
  • 它们确保内核不会被自身的保护所绊倒,例如 表面活性剂或内核特定的地址空间(S/390)。

一些架构使用内存布局,允许这些函数采取捷径,例如使用物理内存的直接映射,但您不能假设情况确实如此,并且它无论如何也不能处理所有情况(换出的页面不存在于物理内存中)。

相关内容