simple_read_from_buffer/simple_write_to_buffer 对比 copy_to_user/copy_from_user

simple_read_from_buffer/simple_write_to_buffer vs. copy_to_user/copy_from_user

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

两者有什么区别?据我了解,copy_..._user 函数更安全。如有错误请指正

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

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

我仍然会保留这个问题,以防万一有人有更好的解释或想纠正我!

simple_read_from_buffer and simple_write_to_buffer 只是 copy_{to,from}_user 的便利包装器,当您需要做的只是从内核缓冲区从用户空间服务 read,或服务 write从用户空间到内核缓冲区。

From my understanding, the copy_..._user functions are more secure.

两个版本都不比另一个版本“更安全”。 是否 更安全取决于具体用例。

我会说 simple_{read,write}_... 通常 会更安全,因为它们在复制之前会为您进行所有适当的检查。如果您需要做的只是为 read/write to/from 内核缓冲区提供服务,那么使用 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);
}

如果不查看模块代码就很难说出您到底需要什么,但我想说您可以:

  1. 如果您想控制函数的确切行为,请使用 copy_{from,to}_user
  2. 如果您不需要这种细粒度的控制并且您可以只返回由这些包装器生成的标准值,请使用 return simple_{read,write}_...