uio 结构
用途
描述要在数据传送中使用的内存缓冲区。
简介
用户 I/O 或 乌约 结构是一个数据结构,用于描述要在数据传输中使用的内存缓冲区。 在支持字符或原始 I/O 的设备驱动程序的读写接口中, 乌约 结构最常用。 它在其他情况下也很有用,在这些情况下,输入或输出缓冲区可以存在于不同类型的地址空间中,并且在虚拟内存中缓冲区不是连续的。
uio 结构在 /usr/include/sys/uio.h 文件中定义。
描述
乌约 结构描述了在虚拟内存中不连续的缓冲区。 它还指示在其中定义了缓冲区的地址空间。 当在字符设备读写接口中使用时,它还包含设备打开方式标志,以及设备读/写偏移量。
内核提供了使用 乌约 结构访问数据的服务。 乌阿特克, 乌里泰克, 乌约莫韦和 乌普希西奥 内核服务都执行到 乌约 结构所描述的数据缓冲区或从数据缓冲区中进行数据传输。 乌阿特克 内核服务将一个字符写入 乌约 结构所描述的缓冲区中。 乌里泰克 内核服务从缓冲区中读取一个字符。 这两个服务的名称与您期望的名称相反,因为它们是为启动操作的用户操作而命名的。 因此,用户部分的读操作将导致设备驱动程序写入缓冲区,而写操作将导致驱动程序从缓冲区读取。
乌约莫韦 内核服务将数据复制到系统地址空间中由 乌约 结构描述的缓冲区或从该缓冲区复制到系统地址空间中的缓冲区。 乌普希西奥 内核服务主要由提供原始 I/O 支持的块设备驱动程序使用。 乌普希西奥 内核服务将字符读或写请求转换为块读或写请求,并将其发送到 ddstrategy 例程。
乌约 结构所描述的缓冲区可以由多个不同长度的虚拟内存的非连续区域组成。 这是通过使用一个元素数组来描述数据缓冲区来实现的,每个元素都由一个虚拟内存地址和一个字节长度组成。 每个元素都定义为iovec元素。 乌约 结构还包含一个字段,用于指定该结构所描述的数据缓冲区中的总字节数。
乌约 结构中的另一个字段描述了数据缓冲区的地址空间,该地址空间可以是系统空间,用户空间或跨内存空间。 如果地址空间定义为交叉内存,那么在 乌约 结构中指定了一个额外的交叉内存描述符数组以与该数组相匹配。iovec元素。
乌约 结构还包含字节偏移量 (uio_offset)。此字段是 64 位整数 (offset_t); 它允许文件系统将 I/O 请求发送到具有超过 2 千兆字节的逻辑偏移量的设备驱动程序的读写入口点。 设备驱动程序必须小心,通过将偏移量分配给 32 位变量,或在溢出 32 位变量的计算中使用该偏移量,以免导致显着性损失。
被调用的例程 (设备驱动程序) 被允许在数据传输过程中修改 乌约 和 伊奥韦茨 结构中的字段。 决赛uio_resid实际上,计数用于确定已传输的数据量。 因此,对于每个操作,必须使用实际复制的字节数来减少此计数。
乌约 结构中包含以下字段:
| 字段 | 描述 |
|---|---|
| uio_iov | 一个指向 伊奥韦茨 结构数组的指针,该数组描述用于数据传输的用户缓冲区。 |
| uio_xmem | 一个指向 xmem 结构数组的指针,该数组包含 伊奥韦茨 数组的跨内存描述符。 |
| uio_iovcnt | 由以下项指向的数组中尚未处理的 伊奥韦茨 结构的数目:uio_iov指针。 该计数必须至少为 1。 如果 1 大于 1 ,那么将在 伊奥韦茨 结构所描述的区域内或区域外执行数据 散射聚集 。 |
| uio_iovdcnt | 伊奥韦茨 数组中已处理的 伊奥韦茨 个结构的数目。 |
| uio_offset | 由先前的 寻求, 寻求 子例程调用建立的文件偏移量。 大多数字符设备会忽略此变量,但某些设备 (例如 /dev/mem 伪设备) 会使用并维护此变量。 |
| uio_segflg | 一个标志,用于指示 乌约 结构所描述的缓冲区类型。 此标志通常描述数据区是在用户空间还是内核空间中,还是在交叉内存中。 请参阅 /usr/include/sys/uio.h 文件,以获取此标志的可能值及其含义的描述。 |
| uio_fmode | 在打开文件时指定或由 弗纳特尔 子例程修改的文件方式的值。 此标志描述文件控制参数。 /usr/include/sys/fcntl.h 文件包含此标志的特定值。 |
| uio_resid | 数据传输的字节计数。 它不得超过所有iov_len伊奥韦茨 结构数组中的值。 最初,此字段包含总字节计数,并且在操作完成时,该值必须按实际传输的字节数递减。 |
伊奥韦茨 结构包含要在数据传输中使用的连续数据区的开始地址和长度。 伊奥韦茨 结构是由以下项指向的数组中的元素类型:uio_iov乌约 结构中的字段。 此阵列可以包含任意数量的 伊奥韦茨 结构,其中每个结构都描述单个连续存储器单元。 这些单元合在一起表示要将数据传输到其中或从中传输数据的总区域。 该uio_iovcnt字段提供数组中 伊奥韦茨 结构的数量。
伊奥韦茨 结构中包含以下字段:
| 字段 | 描述 |
|---|---|
| iov_base | 伊奥韦茨 结构中的一个变量,该变量包含由以下项指定的地址空间中连续数据区的基地址:uio_segflag:NONE. 连续数据区的长度由以下项指定:iov_len:NONE. |
| iov_len | 伊奥韦茨 结构中的一个变量,它包含从 iov_base 变量中给定的地址开始的数据区字节长度。 |