检查内核模块中的“.read”函数时出错

问题描述 投票:2回答:1

.read操作应该在内核模块字符设备中返回什么?

我知道copy_to_user(...)返回未复制的字节数,并且成功返回0.我看到如果read()返回除0以外的任何内容,则使return -EFAULT函数copy_to_user(...)的示例。

但是一旦成功,this说要返回0并且this说要返回读取的字节数。什么应该回来?

我也应该检查一下

static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)

比如检查buffer==NULLlen == something?如果是这样,我应该在一个恶劣的条件下返回什么?

c linux linux-kernel kernel-module
1个回答
2
投票

.read操作应返回:

  • 复制到用户提供的缓冲区中的字节数,或
  • 负面错误代码

此外,操作应更新*offset值,因此从文件中进一步读取将返回下一部分数据。

如果驱动程序实现遵循此规则,则像catdd这样的标准命令将正确解释读取系统调用的结果,并且通过可能重复它,向用户输出设备的完整“内容”。

通常,在buffer调用中检查copy_to_user参数的正确性。如果此调用失败(返回非零),则通常由.read返回-EFAULT。

len参数很少检查错误。假设data_len是重新生成数据的长度:

  • 如果len <data_len,将第一个len字节复制到缓冲区并返回len
  • 如果len> data_len,将所有剩余的字节复制到缓冲区并返回data_len
  • 如果data_lenlen为0,则返回0

有时,设备的数据只能通过预定义大小的部分读取。在这种情况下,您可以检查len并返回-EINVAL以防它具有不适当的值。 buffer也可以检查对齐。


例如,当.read成功返回0时,它是正确的,直到设备被自己编写的用户空间程序使用,该程序不检查返回数据的实际长度。

© www.soinside.com 2019 - 2024. All rights reserved.