【发布时间】:2012-10-17 00:13:37
【问题描述】:
我只是想知道为什么 copy_from_user(to, from, bytes) 做真正的复制?因为它只是想让内核访问用户空间数据,它可以直接将物理地址映射到内核的地址空间而不移动数据吗? 谢谢,
【问题讨论】:
-
你的意思是为什么它不做真正的复制?源代码告诉你什么?
标签: c linux-kernel
我只是想知道为什么 copy_from_user(to, from, bytes) 做真正的复制?因为它只是想让内核访问用户空间数据,它可以直接将物理地址映射到内核的地址空间而不移动数据吗? 谢谢,
【问题讨论】:
标签: c linux-kernel
copy_from_user() 通常在编写某些设备驱动程序时使用。请注意,这里没有字节的“映射”,唯一发生的事情是将字节从映射到用户空间的某个虚拟位置复制到内核空间中某个位置的字节。这样做是为了强制分离内核和用户并防止任何安全漏洞——您永远不希望内核开始访问和读取任意用户内存位置,反之亦然。这就是系统调用的参数和结果在实际运行之前被复制到用户/从用户复制的原因。
【讨论】:
“在此之前最好知道为什么要使用copy_from_user()”
因为内核从不允许用户空间应用程序直接访问内核内存,因为如果指向的内存无效或在读取时发生错误,那么仅使用用户空间应用程序就会使内核恐慌。
“这就是为什么!!!!!!”
所以在使用 copy_from_user 时,它可能会给用户带来错误,并且不会影响内核功能
尽管这是一项额外的工作,但它确保了内核的安全可靠运行
【讨论】:
copy_from_user() 在开始复制数据之前会进行一些检查。直接从用户空间操作数据绝不是一个好主意,因为它存在于一个可能被换出的虚拟地址空间中。
http://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/
【讨论】:
系统调用实现的主要要求之一是检查作为参数传递的用户参数指针的有效性,内核不应该盲目地跟随用户指针,因为用户指针可以在很多方面发挥作用。主要担忧是: 1.它应该是来自该进程地址空间的指针 - 这样它就不能进入其他进程地址空间。 2. 它应该是来自用户空间的指针——它不应该欺骗内核空间指针。 3.它不应该绕过内存访问限制。
这就是执行 copy_from_user() 的原因。它处于阻塞状态并且进程休眠,直到页面错误处理程序可以将页面从交换文件带到物理内存。
【讨论】: