什么是间接缓冲区和间接描述符?

What is indirect buffer and indirect descriptor?

最近我正在阅读 linux 内核中的 virtio 代码。我在源代码中遇到了 "indirect buffer" 和 "indirect descriptor"。我想知道"indirect"是什么意思?

您可能遇到过 virtqueue 概念。 virtqueue ring 有一定的(有限的)容量,并且,由于某些设备可能通过同时调度大量大请求来工作更有效, 间接描述符 特性派上用场,允许这种操作。这个想法只是为了增加环容量,这是通过存储一个 间接描述符 table anywhere 在内存中并在主 virtqueue 中插入 描述符(INDIRECT 标志设置在这样的描述符上以显示其性质)。因此,当在主环中处理此类 indirect 描述符时,控制权将传递给 indirect descriptor table (驻留在主环中 间接描述符 addrlen 描述的内存缓冲区中。然后 table 中的描述符得到处理,table 的结尾由缺少 NEXT 当前描述符中的标志。当发现该标志未设置时,控制权将传递回 virtqueue.

所以,粗略地说,这只是一种技巧,可以通过少量描述符来 "substitute" 环中的普通描述符,从而增加整体容量。因此,间接描述符 - 是环中的一个普通描述符,它设置了INDIRECT标志并且引用了一个间接缓冲区。后者是一块内存,其中包含要处理的 table 个普通描述符。

另请注意 间接描述符 table 中的描述符本身不能是间接的。