AMP相关:4 Linux virtio子系统概览
Virtio是一个开源的虚拟化I/O设备标准,它在虚拟化环境中扮演着至关重要的角色。
Virtio提供了一种标准化的设备接口,使得虚拟机(guest)可以在不同的虚拟化平台上使用相同的驱动程序,而不受底层硬件或虚拟化技术的限制。
Virtio设计了高效的数据交换机制,如使用虚拟队列(virtqueues)进行数据传输,减少了虚拟化环境中的性能开销。
virtio子系统包括如下部分:
- 基于virtio的前端驱动包括:
- virtio-blk:这是一个虚拟块设备,用于提供对虚拟硬盘的访问。它允许虚拟机或容器访问存储卷,就像访问物理硬盘一样。
- virtio-net:虚拟网络设备,提供对虚拟网络接口的访问。它允许虚拟机或容器连接到虚拟网络并与其他设备通信。
- virtio-psci:Power State Coordination Interface (PSCI) 是一种用于管理 CPU 电源状态的接口,包括 CPU 的启动、停止和电源状态转换。
- virtio-balloon:这个设备用于动态调整虚拟机的内存大小。它允许虚拟机根据需要“膨胀”或“收缩”,从而更有效地使用主机的内存资源。
- virtio-scsi:虚拟 SCSI 设备,提供对 SCSI 存储设备的虚拟化访问。它允许虚拟机使用 SCSI 协议与存储设备通信。
- virtio-rpmsg:这是 virtio 远程处理器消息传递设备,用于在异构多处理器系统中实现不同处理器核心之间的通信。它基于 virtio 框架,使用共享内存和 virtqueues 进行高效的消息交换。
- virtio核心负责virtio_bus总线、驱动和设备的注册注销等。
- virtio ring负责virtio queue维护等。
- virtio后端程序。
1 virtio配置
当使能remoteproc、rpmsg_virtio时, virtio功能会被打开。同时还可以配置如下驱动:
Device Drivers
Virtio drivers
Virtio balloon driver
Virtio input driver
Platform bus driver for memory mapped virtio devices
Memory mapped virtio devices parameter parsing
2 virtio文件
virtio子系统提供了:
- 子系统初始化,设备和驱动管理API接口。
- virtqueue管理API。
- 以及一系列预定义驱动:virtio balloon、virtio input、virtio mmio。
drivers/virtio/
├── virtio.c--virtio子系统初始化,以及驱动和设备注册注销接口等。 └── virtio_ring.c--virtqueue管理API。
3 virtio子系统初始化
virtio_init中注册virtio总线:
virtio_init
bus_register--创建virtio总线virtio_bus。
virtio上创建的设备都具有如下属性节点:
static struct attribute *virtio_dev_attrs[] = { &dev_attr_device.attr, &dev_attr_vendor.attr, &dev_attr_status.attr, &dev_attr_modalias.attr, &dev_attr_features.attr, NULL, }; ATTRIBUTE_GROUPS(virtio_dev);
4 virtio子系统API和数据结构
virtqueue
(虚拟队列)是Virtio中用于实现设备驱动程序和虚拟设备之间的数据交换的核心数据结构。
struct virtqueue { struct list_head list;--同一virtio_device下virtqueue列表。 void (*callback)(struct virtqueue *vq); const char *name; struct virtio_device *vdev;--被virtqueue所属的virtio_device。 unsigned int index; unsigned int num_free; void *priv; };
struct virtio_driver
定义了Virtio驱动程序的属性和操作函数:
struct virtio_driver { struct device_driver driver; const struct virtio_device_id *id_table;--驱动程序支持的设备ID列表。 const unsigned int *feature_table;--驱动程序支持的特性列表。 unsigned int feature_table_size;--特性表的大小。 const unsigned int *feature_table_legacy; unsigned int feature_table_size_legacy; int (*validate)(struct virtio_device *dev);--用于验证设备特性的回调函数。 int (*probe)(struct virtio_device *dev);--当驱动程序发现设备时被调用的函数。 void (*scan)(struct virtio_device *dev); void (*remove)(struct virtio_device *dev);--当设备被移除时被调用的函数。 void (*config_changed)(struct virtio_device *dev);--当设备的配置发生变化时被调用的函数。 #ifdef CONFIG_PM int (*freeze)(struct virtio_device *dev); int (*restore)(struct virtio_device *dev); #endif };
注册和注销virtio驱动:
int register_virtio_driver(struct virtio_driver *drv); void unregister_virtio_driver(struct virtio_driver *drv);
virtio_device
表示一个Virtio设备,包含设备的状态、特性和配置。
struct virtio_device { int index; bool failed; bool config_enabled; bool config_change_pending; spinlock_t config_lock; struct device dev; struct virtio_device_id id;--设备的Virtio ID。 const struct virtio_config_ops *config;--指向设备的配置结构。 const struct vringh_config_ops *vringh_config; struct list_head vqs;--包含设备所有虚拟队列的列表。 u64 features; void *priv; };
注册或注销virtio设备:
int register_virtio_device(struct virtio_device *dev); void unregister_virtio_device(struct virtio_device *dev);
参考文档:《virtio —— 一种 Linux I/O 半虚拟化框架 [译]》《linux IO虚拟化 - virtio介绍及代码分析》《virtio简介(一)—— 框架分析》。
联系方式:arnoldlu@qq.com