ddwrite 设备驱动程序入口点

用途

将数据写出到字符设备。

语法

#include <sys/device.h>
#include <sys/types.h>
int ddwrite (devno, uiop, chan, ext)
dev_t  devno;
struct uio * uiop;
chan_t  chan;
int  ext;

参数

描述
德夫诺 指定 主要和次要设备号
乌约普 指向一个 乌约 结构,该结构描述要写入的一个或多个数据区。
指定 通道号
分机 指定 扩展参数

描述

当程序发出 子例程调用或使用 弗 p_rwuio 内核服务时,内核会调用 ddwrite 入口点。

此入口点接收到指向 乌约 结构的指针,该结构提供用于指定数据传输操作的变量。

子例程调用期间,字符设备驱动程序可以使用 乌里泰克乌约莫韦 内核服务将数据传送到用户缓冲区以及从用户缓冲区传送数据。 这些服务将传递到 乌约 结构的指针。 它们通过传输的字节数来更新结构中的字段。 乌约 结构中唯一可能未被数据传输修改的字段是:uio_fmodeuio_segflg字段。

对于大多数设备, ddwrite 例程会对向设备处理程序发出的请求进行排队,然后等待该请求完成。 等待通常是通过调用 睡眠 内核服务来等待事件完成的。 睡眠 内核服务会暂挂驱动程序和调用它的进程,并允许其他进程运行。

当 I/O 操作完成时,该设备通常会导致 中断,从而导致调用设备驱动程序的中断处理程序。 然后,中断处理程序将调用 警醒 内核服务以指定等待的事件,从而允许 ddwrite 例程继续运行。

uio_resid字段最初包含要写入到设备的总字节数。 如果设备驱动程序支持它,那么uio_offset字段指示设备上应该开始写操作的字节偏移量。

uio_offset字段是 64 位整数 (offset_t); 这允许文件系统将 I/O 请求发送至逻辑偏移超过 2 千兆字节的设备驱动程序的读写入口点。 设备驱动程序必须小心,通过将偏移量分配给 32 位变量,或在溢出 32 位变量的计算中使用该偏移量,以免导致显着性损失。

如果未发生任何错误,那么uio_residddwrite 例程返回时,字段应该为 0 ,以指示已写入所有请求的字节。 如果发生错误,那么此字段应包含发生错误时剩余的要写入的字节数。

如果写请求在有效设备偏移量处开始,但超出了设备能力的末尾,那么不应返回任何错误。 但是,uio_resid字段应指示未传输的字节数。 如果写操作在设备功能结束时或结束时开始,那么不应该传输任何数据。 应该会返回错误代码 ENXIO ,并且uio_resid不应该修改字段。

在为块设备的原始 I/O 提供 ddwrite 入口点时,此例程通常使用 乌普希西奥 内核服务将请求转换为块 I/O 请求。

执行环境

只有在 流程环境中才会执行 ddwrite 例程。 它应该通过将锁定内核服务与驱动程序中定义的专用锁定字结合使用来提供其数据结构的必需序列化。

返回值

ddwrite 入口点可以通过返回非零返回值来向调用者指示错误条件。 这会导致子程序返回 -1 值。 它还使返回码可供 错误号 全局变量中的用户方式程序使用。 使用的错误代码应是 /usr/include/sys/errno.h 文件中定义的值之一。

如果适用,应该使用 write 子例程的 POSIX 1003.1 标准中定义的返回值。

相关信息

德赖德 设备驱动程序入口点。

睡眠 内核服务, 警醒 内核服务, 弗 p_rwuio 内核服务, 乌约莫韦 内核服务, 乌普希西奥 内核服务, 乌里泰克 内核服务。

乌约 结构。

子例程。

设备驱动程序内核扩展概述,了解设备驱动程序角色, 了解中断了解锁定内核扩展和设备支持编程概念