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

Error checking in a '.read' function in kernel module

内核模块字符设备中的.read操作return应该做什么?

我知道 copy_to_user(...) returns 未复制的字节数并且成功时 returns 0。我看到了使 read() 函数 return -EFAULT 如果 copy_to_user(...) returns 不是 0.

但是一旦成功,this says to return 0 and this 就会告诉 return 读取的字节数。 returning 应该是什么?

我还应该检查

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

比如检查 buffer==NULLlen == something?如果是这样,我应该return 条件不好怎么办?

.read 操作应该 return 要么:

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

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

如果驱动程序实现遵循此规则,标准命令如 catdd 将正确解释 read 系统调用的结果,并且可能重复它,输出给用户完整的 "content" 设备。

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

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

  • 如果 len < data_len,将第一个 len 字节复制到缓冲区,然后 return len

  • if len > data_len,将所有剩余字节复制到缓冲区,然后 return data_len

  • 如果data_lenlen为0,return0

有时设备的数据只能按预定义大小的部分读取。在那种情况下,您可以检查 len 和 return -EINVAL 以防它有不合适的值。 buffer 也可以检查对齐。


例如,.read returns 成功时为0,直到设备被用户自己编写的程序使用-space才正确,该程序不检查returning 数据的实际长度。