ddread 设备驱动程序入口点

用途

从字符设备中读取数据。

语法

#include <sys/device.h>
#include <sys/types.h>

int ddread ( devno,  uiop,  chan,  ext)
dev_t devno;
struct uio *uiop;
chan_t chan;
int ext;

参数

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

描述

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

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

子例程调用期间,字符设备驱动程序可以使用 乌阿特克乌约莫韦 内核服务将数据传送到用户缓冲区以及从用户缓冲区传送数据。 这些服务接收到指向 乌约 结构的指针,并按传输的字节数更新结构中的字段。 在 乌约 结构中,数据传输无法修改的唯一字段为uio_fmodeuio_segflg字段。

对于大多数设备, 德赖德 例程会将请求发送到设备处理程序,然后等待该请求完成。 可通过调用 睡眠 内核服务来完成等待。 此服务将暂挂该驱动程序以及调用它的进程,并允许其他进程运行到发生指定事件为止。

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

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

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

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

如果读请求在有效设备偏移量处开始,但超出了设备功能的末尾,那么不应返回任何错误。 但是,uio_resid字段应指示未传输的字节数。 如果读操作在设备功能结束时开始,那么不应该返回任何错误。 但是,uio_resid字段不应该被修改,表示未传输任何字节。 如果读操作在设备功能结束后开始,那么应该返回 ENXIO 返回码,而不修改uio_resid:NONE.

如果为块设备的原始 I/O 提供了 德赖德 入口点,那么此例程通常使用 乌普希西奥 内核服务将请求转换为块 I/O 请求。

执行环境

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

返回值

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

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