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

时间:2015-10-29 19:46:19

标签: c linux linux-kernel kernel-module

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

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

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

我也应该查看

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

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

1 个答案:

答案 0 :(得分:2)

.read操作应返回:

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

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

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

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

很少检查

len参数的错误。假设data_len为遗留数据的长度:

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

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

  • 如果data_lenlen为0,则返回0

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

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