检查内核模块中的“.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==NULL
或 len == something
?如果是这样,我应该return 条件不好怎么办?
.read
操作应该 return 要么:
- 复制到用户提供的缓冲区中的字节数,或
- 负错误代码
此外,操作应该更新 *offset
值,因此从文件中进一步读取将 return 下一部分数据。
如果驱动程序实现遵循此规则,标准命令如 cat
、dd
将正确解释 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_len
或len
为0,return0
有时设备的数据只能按预定义大小的部分读取。在那种情况下,您可以检查 len
和 return -EINVAL 以防它有不合适的值。 buffer
也可以检查对齐。
例如,.read
returns 成功时为0,直到设备被用户自己编写的程序使用-space才正确,该程序不检查returning 数据的实际长度。
内核模块字符设备中的.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==NULL
或 len == something
?如果是这样,我应该return 条件不好怎么办?
.read
操作应该 return 要么:
- 复制到用户提供的缓冲区中的字节数,或
- 负错误代码
此外,操作应该更新 *offset
值,因此从文件中进一步读取将 return 下一部分数据。
如果驱动程序实现遵循此规则,标准命令如 cat
、dd
将正确解释 read 系统调用的结果,并且可能重复它,输出给用户完整的 "content" 设备。
通常,在 copy_to_user
调用中检查 buffer
参数的正确性。如果此调用失败(returns 非零),-EFAULT 通常由 .read
编辑 return。
len
参数很少检查错误。假设 data_len
是剩余数据的长度:
如果
len
<data_len
,将第一个len
字节复制到缓冲区,然后 returnlen
if
len
>data_len
,将所有剩余字节复制到缓冲区,然后 returndata_len
如果
data_len
或len
为0,return0
有时设备的数据只能按预定义大小的部分读取。在那种情况下,您可以检查 len
和 return -EINVAL 以防它有不合适的值。 buffer
也可以检查对齐。
例如,.read
returns 成功时为0,直到设备被用户自己编写的程序使用-space才正确,该程序不检查returning 数据的实际长度。