Shuzheng Asked: 2021-10-28 01:20:58 +0800 CST2021-10-28 01:20:58 +0800 CST 2021-10-28 01:20:58 +0800 CST 当内核被映射到与进程本身相同的虚拟地址空间时,为什么需要 `copy_from_user()` 和 `copy_to_user()`? 772 当内核映射到与进程本身相同的虚拟地址空间时,为什么需要copy_from_user()并且需要?copy_to_user() 在为学习目的开发了一些(玩具)内核模块后,我很快意识到了这一点,copy_from_user()并且copy_to_user()需要将数据从用户空间缓冲区复制到用户空间缓冲区;否则与无效地址相关的错误会导致崩溃。 但是,如果0x1fffff虚拟地址指向用户空间缓冲区,那么为什么该地址在内核中无效?内核位于相同的虚拟地址空间中,因此0x1fffff将映射到相同的物理内存。 kernel drivers 1 个回答 Voted Best Answer Stephen Kitt 2021-10-28T01:36:40+08:002021-10-28T01:36:40+08:00 地址空间映射在某些(不是全部!)架构上是相同的,但即使在它们相同的架构上,保护级别也不同。copy_from_user等服务于三个主要目的: 他们检查要读取或写入的内存的权限是否允许在用户空间中运行的进程对其进行读取或写入——这确保进程不能欺骗内核访问进程不应访问的内存能够; 它们允许特定的错误处理,以便保护错误不会使内核崩溃,例如,如果请求的地址当前未映射(考虑零页或换出页); 它们确保内核不会越过它自己的保护,例如 SMAP或内核特定的地址空间 (S/390)。 一些体系结构使用允许这些功能走捷径的内存布局,例如使用物理内存的直接映射,但你不能假设是这种情况,它也不能处理所有情况(换出的页面不是' t 存在于物理内存中)。
地址空间映射在某些(不是全部!)架构上是相同的,但即使在它们相同的架构上,保护级别也不同。
copy_from_user
等服务于三个主要目的:一些体系结构使用允许这些功能走捷径的内存布局,例如使用物理内存的直接映射,但你不能假设是这种情况,它也不能处理所有情况(换出的页面不是' t 存在于物理内存中)。