什么是间接缓冲区和间接描述符?
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 (驻留在主环中 间接描述符 的 addr
和 len
描述的内存缓冲区中。然后 table 中的描述符得到处理,table 的结尾由缺少 NEXT
当前描述符中的标志。当发现该标志未设置时,控制权将传递回 virtqueue.
所以,粗略地说,这只是一种技巧,可以通过少量描述符来 "substitute" 环中的普通描述符,从而增加整体容量。因此,间接描述符 - 是环中的一个普通描述符,它设置了INDIRECT
标志并且引用了一个间接缓冲区。后者是一块内存,其中包含要处理的 table 个普通描述符。
另请注意 间接描述符 table 中的描述符本身不能是间接的。
最近我正在阅读 linux 内核中的 virtio 代码。我在源代码中遇到了 "indirect buffer" 和 "indirect descriptor"。我想知道"indirect"是什么意思?
您可能遇到过 virtqueue 概念。 virtqueue ring 有一定的(有限的)容量,并且,由于某些设备可能通过同时调度大量大请求来工作更有效, 间接描述符 特性派上用场,允许这种操作。这个想法只是为了增加环容量,这是通过存储一个 间接描述符 table anywhere 在内存中并在主 virtqueue 中插入 其 描述符(INDIRECT
标志设置在这样的描述符上以显示其性质)。因此,当在主环中处理此类 indirect 描述符时,控制权将传递给 indirect descriptor table (驻留在主环中 间接描述符 的 addr
和 len
描述的内存缓冲区中。然后 table 中的描述符得到处理,table 的结尾由缺少 NEXT
当前描述符中的标志。当发现该标志未设置时,控制权将传递回 virtqueue.
所以,粗略地说,这只是一种技巧,可以通过少量描述符来 "substitute" 环中的普通描述符,从而增加整体容量。因此,间接描述符 - 是环中的一个普通描述符,它设置了INDIRECT
标志并且引用了一个间接缓冲区。后者是一块内存,其中包含要处理的 table 个普通描述符。
另请注意 间接描述符 table 中的描述符本身不能是间接的。