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);
}
如果不查看模块代码就很难说出您到底需要什么,但我想说您可以:
- 如果您想控制函数的确切行为,请使用
copy_{from,to}_user
。
- 如果您不需要这种细粒度的控制并且您可以只返回由这些包装器生成的标准值,请使用
return simple_{read,write}_...
。
我最近写了一个实现这些功能的模块。
两者有什么区别?据我了解,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);
}
如果不查看模块代码就很难说出您到底需要什么,但我想说您可以:
- 如果您想控制函数的确切行为,请使用
copy_{from,to}_user
。 - 如果您不需要这种细粒度的控制并且您可以只返回由这些包装器生成的标准值,请使用
return simple_{read,write}_...
。