buf 结构
用途
描述程序与外围设备之间的缓冲数据传送
内核缓冲区的简介
对于块设备,使用内核缓冲区来缓冲程序与外围设备之间的数据传输。 这些缓冲区以 4096 字节的块为单位进行分配。 在任何给定的时间,每个内存块都是设备驱动程序和内核所维护的两个链接列表之一的成员:
| 列表 | 描述 |
|---|---|
| 可用缓冲区队列 (avlist) | 可供使用的所有缓冲区的列表。 这些缓冲区不包含等待传输到设备或从设备传输的数据。 |
| 繁忙缓冲区队列 (blist) | 包含等待传输到设备或从设备传输的数据的所有缓冲区的列表。 |
每个缓冲区都有一个关联的缓冲区头,称为指向它的 布夫 结构。 每个缓冲区头都有几个部分:
- 有关块的信息
- 用于显示状态信息的标志
- 繁忙列表正向和反向指针
- 可用的列表前进和后退指针
设备驱动程序将维护av_forw和av_back指针 (对于可用块) ,而内核将维护b_forw和b_back指针 (对于繁忙块)。
buf 块 I/O 的结构变量
在 /usr/include/sys/buf.h 文件中定义的 buf 结构包含以下字段:
| 项 | 描述 |
|---|---|
| b_flags | 标志位。 此字段的值是通过逻辑 ORing 0 或更多以下值来构造的:
|
| 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 | 跨内存描述符。 |