错误检查内核模块中的读取function

内核模块字符设备中应该读取哪个操作? 我知道copy_to_user(...)将返回未复制的字节数,并在成功将返回0.我看到例如使得read()函数return -EFAULT如果copy_to_user(...)返回0以外的任何东西。但是在成功之后, 这个返回0, 这表示返回读取的字节数。 我应该回来什么? 还应该检查static ssize_t dev_read(struct file *filep, char *buffer, size_t len, loff_t *offset)如检查如果buffer==NULLlen == something? 如果是的话,我应该怎么回到一个坏的条件?

.read操作应该返回:

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

此外,操作应该更新*offset值,所以从文件中读取数据将会返回下一部分。

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

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

len参数很少检查错误。 假设data_len是剩余数据的长度:

  • 如果len < data_len ,则将第一个len字节复制到缓冲区并返回len

  • 如果len > data_len ,则将所有剩余的字节复制到缓冲区并返回data_len

  • 如果data_lenlen是0,则返回0

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


例如,在.read返回0的情况下,直到设备被自己写入的用户空间程序使用,它不检查返回数据的实际长度是正确的。