如果设备驱动程序没有实现异步写入功能会发生什么?

如果设备驱动程序没有实现异步写入功能会发生什么?

ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);

用于从设备检索数据。此位置的空指针会导致 read 系统调用失败,并显示 -EINVAL(“Invalid argument”)。非负返回值表示成功读取的字节数(返回值是“有符号大小”类型,通常是目标平台的本机整数类型)。

ssize_t (*aio_read)(struct kiocb *, char __user *, size_t,loff_t);

启动异步读取——在函数返回之前可能无法完成的读取操作。如果此方法为NULL,则所有操作都将通过读取(同步)进行处理。

ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);

向设备发送数据。如果为 NULL,则将 -EINVAL 返回给调用 write 系统调用的程序。返回值如果非负,则表示成功写入的字节数。

ssize_t (*aio_write)(struct kiocb *, const char __user *, size_t, loff_t *);

在设备上启动异步写入操作。

从 LDD3 获取此声明,谁能解释一下如果设备驱动程序未实现异步写入功能会发生什么?将会,它会像异步读取一样升级为静默同步(如果为 NULL)。

答案1

中的和aio_read条目已过时aio_writefile_operationsread_iter,被和取代(尽管不相同)write_iter。可写file_operations需要至少具有write和/或之一write_iter,并且 VFS 将使用可用的任何一个。 (提前检查可用性并使用 进行记录FMODE_CAN_WRITE。)

aio_write本身确实需要write_iter,并且-EINVAL如果不可用则返回。有通用实现available 可以在很多情况下使用,但不会自动用作后备。

相关内容