首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >simple_read_from_buffer/simple_write_to_buffer与复制_to_user/copy_from_user

simple_read_from_buffer/simple_write_to_buffer与复制_to_user/copy_from_user
EN

Stack Overflow用户
提问于 2020-06-19 00:08:06
回答 1查看 2K关注 0票数 2

我最近编写了一个实现这些功能的模块。

这两者有什么区别呢?据我理解,copy_..._user函数更安全。如果我弄错了,请纠正我。

此外,将这两个功能混合在一个程序中是否是个坏主意?例如,我在我的misc dev read函数中使用了simple_read_from_buffer,在写函数中使用了copy_from_user

编辑:我相信我从阅读fs/libfs.c (我不知道这些函数的源代码位于这里)中找到了问题的答案;根据我的理解,simple_...()函数本质上是copy_...()函数的包装器。在我的例子中,我认为使用copy_from_user作为misc设备写函数是合适的,因为我需要在将输入返回到用户缓冲区之前验证输入是否匹配特定的字符串。

我仍然会留下这个问题,但如果有人有更好的解释或想纠正我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-20 12:13:28

simple_read_from_buffersimple_write_to_buffer只是copy_{to,from}_user的方便包装器,当您只需要从内核缓冲区从用户空间为read服务,或者从用户空间向内核缓冲区提供write服务时。

据我所知,

copy_..._user函数更安全。

这两种版本都没有其他版本“更安全”。是否更安全取决于具体的用例。

我想说的是,一般来说,simple_{read,write}_...可以更安全,因为它们在复制之前为您做了所有适当的检查。如果只需要为内核缓冲区提供读/写服务,那么使用simple_{read,write}_...肯定比手动检查和调用copy_{from,to}_user更快、更容易出错。

下面是一个很好的例子,说明这些函数是有用的:

代码语言:javascript
运行
复制
#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.

  • Use a return simple_{read,write}_...的确切行为,如果您不需要这样细粒度的控制,并且只返回包装器产生的标准值,则
  1. 使用copy_{from,to}_user

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62461312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档