我只是想知道为什么copy_from_user(to,from,bytes)会进行真正的复制?因为它只是希望内核访问用户空间数据,它能否直接将物理地址映射到内核的地址空间而不移动数据? 谢谢,
答案 0 :(得分:2)
copy_from_user()
。请注意,没有"映射"这里的字节,唯一发生的事情是将字节从映射在用户空间中的某个虚拟位置复制到内核空间中某个位置的字节。这样做是为了强制分离内核和用户并防止任何安全漏洞 - 您永远不希望内核开始访问和读取任意用户内存位置,反之亦然。这就是系统调用的参数和结果在实际运行之前复制到用户或从用户复制的原因。
答案 1 :(得分:1)
copy_from_user()在开始复制数据之前会做一些检查。直接操作来自用户空间的数据绝不是一个好主意,因为它存在于可能被换出的虚拟地址空间中。
http://www.ibm.com/developerworks/linux/library/l-kernel-memory-access/
答案 2 :(得分:0)
系统调用实现的主要要求之一是检查作为参数传递的用户参数指针的有效性,内核不应盲目跟随用户指针,因为用户指针可以在很多方面起作用。主要关注点是: 1.它应该是来自该进程地址空间的指针 - 因此它无法进入某个其他进程地址空间。 2.它应该是来自用户空间的指针 - 它不应该欺骗内核空间指针。 3.它不应绕过内存访问限制。
这就是执行copy_from_user()的原因。它是阻塞和进程休眠,直到页面错误处理程序可以将页面从交换文件带到物理内存。
答案 3 :(得分:0)
“在此之前,最好知道为什么 copy_from_user()被使用”
因为内核永远不允许用户空间应用程序直接访问内核内存,因为如果指向的内存无效或者在读取时发生了错误,那么内核只需使用用户空间应用程序即可发生恐慌。
“这就是为什么!!!!!!”
因此,使用 copy_from_user 时,它可能会给用户带来错误,并且不会影响内核功能
尽管这是额外的努力,但它确保了内核
的安全操作