IO虚拟化 - virtio-vring的三个组成结构【转】

1. 初始化三个结构

vring_new_virtqueue函数中初始化virtqueue的各种字段的初始值

vq->vq.callback = callback;
vq->vq.vdev = vdev;
vq->vq.name = name;
vq->notify = notify;
vq->broken = false;
vq->last_used_idx = 0;
vq->num_added = 0;
list_add_tail(&vq->vq.list, &vdev->vqs);
vq->in_use = false;
vq->indirect = virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC);
vq->event = virtio_has_feature(vdev, VIRTIO_RING_F_EVENT_IDX);
vq->num_free = num;
vq->free_head = 0;
for (i = 0; i < num-1; i++) {
	vq->vring.desc[i].next = i+1;
	vq->data[i] = NULL;
}
vq->data[i] = NULL;

如果有请求,将请求的信息存放到vring的desc中,同时在vring.avail->ring[idx]中存放desc中的第一个索引的下标(一个req可能占用多个desc)

virtqueue_add_buf

分两种情况:

  1. 存在indirect description table
    1). 分配该间接描述符表的空间
    2

你可能感兴趣的:(#,虚拟化技术)