我最近编写了一个实现这些功能的模块。
这两者有什么区别呢?据我理解,copy_..._user
函数更安全。如果我弄错了,请纠正我。
此外,将这两个功能混合在一个程序中是否是个坏主意?例如,我在我的misc dev read
函数中使用了simple_read_from_buffer
,在写函数中使用了copy_from_user
。
编辑:我相信我从阅读fs/libfs.c
(我不知道这些函数的源代码位于这里)中找到了问题的答案;根据我的理解,simple_...()
函数本质上是copy_...()
函数的包装器。在我的例子中,我认为使用copy_from_user
作为misc设备写函数是合适的,因为我需要在将输入返回到用户缓冲区之前验证输入是否匹配特定的字符串。
我仍然会留下这个问题,但如果有人有更好的解释或想纠正我!
发布于 2020-06-20 12:13:28
simple_read_from_buffer
和simple_write_to_buffer
只是copy_{to,from}_user
的方便包装器,当您只需要从内核缓冲区从用户空间为read
服务,或者从用户空间向内核缓冲区提供write
服务时。
据我所知,
的
copy_..._user
函数更安全。
这两种版本都没有其他版本“更安全”。是否更安全取决于具体的用例。
我想说的是,一般来说,simple_{read,write}_...
可以更安全,因为它们在复制之前为您做了所有适当的检查。如果只需要为内核缓冲区提供读/写服务,那么使用simple_{read,write}_...
肯定比手动检查和调用copy_{from,to}_user
更快、更容易出错。
下面是一个很好的例子,说明这些函数是有用的:
#define SZ 1024
static char kernel_buf[SZ];
static ssize_t dummy_read(struct file *filp, char __user *user_buf, size_t n, loff_t *off)
{
return simple_read_from_buffer(user_buf, n, off, kernel_buf, SZ);
}
static ssize_t dummy_write(struct file *filp, char __user *user_buf, size_t n, loff_t *off)
{
return simple_write_to_buffer(kernel_buf, SZ, off, user_buf, n);
}
如果不查看模块的代码,很难准确地知道需要什么,但我想说,您可以这样做:
如果您想要控制function.
return simple_{read,write}_...
的确切行为,如果您不需要这样细粒度的控制,并且只返回包装器产生的标准值,则copy_{from,to}_user
。。
https://stackoverflow.com/questions/62461312
复制相似问题