buf 结构

用途

描述程序与外围设备之间的缓冲数据传送

内核缓冲区的简介

对于块设备,使用内核缓冲区来缓冲程序与外围设备之间的数据传输。 这些缓冲区以 4096 字节的块为单位进行分配。 在任何给定的时间,每个内存块都是设备驱动程序和内核所维护的两个链接列表之一的成员:

列表 描述
可用缓冲区队列 (avlist) 可供使用的所有缓冲区的列表。 这些缓冲区不包含等待传输到设备或从设备传输的数据。
繁忙缓冲区队列 (blist) 包含等待传输到设备或从设备传输的数据的所有缓冲区的列表。

每个缓冲区都有一个关联的缓冲区头,称为指向它的 布夫 结构。 每个缓冲区头都有几个部分:

  • 有关块的信息
  • 用于显示状态信息的标志
  • 繁忙列表正向和反向指针
  • 可用的列表前进和后退指针

设备驱动程序将维护av_forwav_back指针 (对于可用块) ,而内核将维护b_forwb_back指针 (对于繁忙块)。

buf 块 I/O 的结构变量

/usr/include/sys/buf.h 文件中定义的 buf 结构包含以下字段:

描述
b_flags 标志位。 此字段的值是通过逻辑 ORing 0 或更多以下值来构造的:
写 (_WRITE)
此操作是写操作。
读取 (_READ)
此操作是读数据操作,而不是写操作。
已完成 (_D)
缓冲区上的 I/O 操作已完成,因此缓冲区信息比其他版本更新。
错误 (_ERROR)
发生了传输错误,事务已异常中止。
B_BUSY
该块不在空闲列表上。
B_INFLGHT
此 I/O 请求已发送至物理设备驱动程序以进行处理。
年龄 (_AGE)
数据不太可能很快被复用,因此首选此缓冲区进行复用。 此标志建议缓冲区位于空闲列表的头,而不是位于末尾。
B_ASYNC
正在此块上执行异步 I/O。 完成 I/O 后,释放该块。
B_DELWRI
仍然需要写出此缓冲区的内容,然后才能复用此缓冲区,即使此块可能在空闲列表中也是如此。 当系统期望另一个对同一块的写操作很快发生时, 子例程将使用此方法。
B_NOHIDE
指示在直接存储器存取 (DMA) 传输期间不应隐藏该数据页。
B_SETMOD
允许增强的 I/O 文件系统使页面被认为是已修改的。
统计信息 (_S)
由于 I/O 错误,该数据与磁盘上的数据冲突。
B_ XREADONLY
指示外部寻呼机缓冲区列表中的只读页。
B_MORE_DONE
设置时,向此 布夫 结构的接收方指示在 IODONE 级别中有更多结构排队。 这允许设备驱动程序在处理任何新请求之前处理所有已完成的请求。
B_SPLIT
设置后,指示传输可以在数据缓冲区中的任何位置开始。
b_forw 正向繁忙块指针。
b_back 向后繁忙的块指针。
av_forw 驱动程序请求队列的前转指针。
av_back 用于驱动程序请求队列的反向指针。
b_iodone 调用 策略 例程的任何人都必须将此字段设置为指向其 I/O 完成例程。 当 I/O 完成时,将在 INTIODONE 中断 级别上调用此例程。
b_dev 主要和次要设备号。
b_bcount 数据传输的字节计数。
b_un.b_addr 这是数据缓冲区的内存地址。
b_blkno 设备上的块号。
b_resid 发生错误后未传输的数据量。
b_event 事件列表的锚点。
b_xmemd 跨内存描述符。