gpt4 book ai didi

linux - 我可以说 copy_to_user()/copy_from_user() 是一个带有 access_ok() 的 memcpy 吗?

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:58 69 4
gpt4 key购买 nike

我们知道为了安全问题,如果我们想在用户空间和内核空间之间进行内存复制,我们应该使用copy_to_user()/copy_from_user()。

我的问题是,memcpy() 应该比 copy_to_user()/copy_from_user() 有更好的性能?因为 memcpy() 没有做任何尝试保护系统的事情,对吗?

如果我们不关心安全问题,是否可以使用 memcpy() 而不是 copy_to_user()/copy_from_user() 来获得更好的性能? (这是一个坏主意,我知道,只是问它是否正确)

最佳答案

一个答案:不,因为安全问题在内核中从来都不是无关紧要的。

memcpy() 尤其是一个不好用的函数,因为第三个参数是一个带符号的整数。如果用户可以以任何方式影响第三个参数的值,那么如果有人试图复制负数的字节,您将面临严重的责任问题。

许多严重的缓冲区溢出错误都是由于 memcpy() 的签名造成的

另一个答案:不,因为 copy_to_user()copy_from_user() 不只是执行 access_ok()。前两个功能确保您当前正在尝试实现的副本将成功或适本地失败。这不是 access_ok() 为您所做的。 access_ok() 的文档明确指出此函数不能保证内存访问实际上会成功:

Note that, depending on architecture, this function probably just 
checks that the pointer is in the user space range - after calling
this function, memory access functions may still return -EFAULT.

例如,对于 x86,我最近的源代码具有超出 access_ok() 的运行时检查:https://lwn.net/Articles/612153/

还有第三个答案:memcpy() 的效率可能并没有提高多少。原则上,您可能会在这里和那里保存一些说明,但是一旦您复制的不仅仅是最小数量的数据,这些设置和检查说明将可以忽略不计。

关于linux - 我可以说 copy_to_user()/copy_from_user() 是一个带有 access_ok() 的 memcpy 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40415046/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com