11

我正在阅读 Robert Love 的 Linux Kernel Development。我不明白这一段关于bio结构的内容:

内核中块 I/O 的基本容器是 bio 结构,它定义在<linux/bio.h>. 此结构将正在运行(活动)的块 I/O 操作表示为段列表。段是在内存中连续的一块缓冲区。因此,各个缓冲区在内存中不需要是连续的。通过允许以块的形式描述缓冲区,bio 结构为内核提供了执行块 I/O 操作的能力,甚至可以从内存中的多个位置执行单个缓冲区的块 I/O 操作。像这样的向量 I/O 称为分散-聚集 I/O。

  1. 究竟是什么flight(active)意思?
  2. “作为细分列表”——我们是在谈论这种细分吗?
  3. “通过允许缓冲区......在内存中”是什么意思?
4

3 回答 3

16

块设备是在 I/O 事务期间处理数据块(512、1024 字节)的设备。“struct bio”可用于来自内核空间的块 I/O 操作。这种结构常用于块设备驱动开发。

Q1) flight(active) 到底是什么意思?

块设备通常使用用于存储文件的文件系统来实现。现在,当用户空间应用程序启动文件 I/O 操作(读、写)时,内核依次通过文件系统管理器启动一系列块 I/O 操作。“结构生物”跟踪要处理的所有块 I/O 事务(由用户应用程序启动)。这就是这里所说的飞行/活动区域。

“Q2)作为细分列表”——我们是在谈论这种细分吗?

内核需要内存缓冲区来保存进出块设备的数据。

在内核中有两种分配内存的可能性。

  1. 虚拟地址连续 - 物理地址连续(使用 kmalloc() - 提供良好的性能但大小有限)
  2. 虚拟地址连续 - 物理地址不连续(使用 vmalloc() - 对于巨大的内存大小要求)

这里的段表示第一种类型,即用于块 IO 传输的连续物理内存。段列表表示一组这样的连续物理内存区域。请注意,列表元素是不连续的内存段。

Q3)“通过允许缓冲区......在内存中”是什么意思?

Scatter-gather 功能允许在单次(读/写事务)中从多个非连续内存位置向/从设备传输数据。这里的“struct bio”记录了要处理的多个段。每个段是一个连续的内存区域,而多个段彼此不连续。“struct bio”为内核提供执行分散收集功能的能力。

于 2013-01-29T07:00:06.343 回答
3
  1. “进行中”是指已请求但尚未启动的操作。
  2. 这里的“段”是指要读取或写入的内存范围,作为操作的一部分要传输的连续数据。
  3. “Scatter/gather I/O”是指分散操作,它在磁盘上获取连续范围的数据并将其分配到内存中,收集在内存中获取不同范围的数据并将它们连续写入磁盘。(在前面用一些合适的设备替换“磁盘”。)一些 I/O 机器能够在一次操作中完成此操作(这越来越普遍)。
于 2013-01-28T22:02:40.887 回答
1

1)“飞行中”是指“进行中” 2)否 3)不太确定 :)

于 2013-01-28T18:55:04.833 回答