Virtio 作为 Linux 虚拟化中前后端通信的核心标准,前文Linux Virtio 驱动框架:架构设计与实现解析解析了整个virtio框架,本文将聚焦 Virtio 子系统的六大核心数据结构,结合代码实现与内存布局,拆解其设计逻辑与核心作用。
1. virtio_bus:虚拟设备的总线基石
virtio_bus是基于 Linux 总线 - 驱动 - 设备模型的虚拟总线,负责管理 virtio 设备与驱动的匹配与生命周期,定义于drivers/virtio/virtio.c。
static struct bus_type virtio_bus = {
.name = "virtio",
.match = virtio_dev_match,
.dev_groups = virtio_dev_groups,
.uevent = virtio_uevent,
.probe = virtio_dev_probe,
.remove = virtio_dev_remove,
};
-
注册机制:通过
core_initcall(virtio_init)注册,启动优先级远高于普通模块(module_init对应device_initcall),确保虚拟化环境早期就绪。 -
匹配逻辑:
virtio_dev_match函数通过virtio_device_id匹配设备与驱动,需同时满足device和vendor字段,且驱动的id_table必须以device=0结尾终止循环。 -
核心作用:作为设备与驱动的 "中间人",完成驱动绑定(
probe)与解绑(remove)的触发。
2. virtio_device:虚拟设备的身份与配置载体
virtio_device封装了虚拟设备的核心属性与状态,定义于include/linux/virtio.h,是前端设备在内核中的抽象表示。
/**
* struct virtio_device - Virtio设备核心结构体,封装虚拟设备的属性、状态与操作接口
* @index: 设备索引,用于区分同一virtio总线上的多个设备实例(如多块virtio-net网卡)
* @failed: 设备故障标记,标识设备是否初始化/运行过程中出现错误,快速判断设备健康状态
* @config_core_enabled: 配置核心功能启用标记,内核侧是否允许访问/修改设备配置空间
* @config_driver_disabled: 驱动侧配置禁用标记,驱动主动禁用设备配置功能(用于管控配置修改场景)
* @config_change_pending: 配置变更待处理标记,标识设备配置项已变更但未完成处理,防止并发处理配置变更
* @config_lock: 配置操作自旋锁,保护配置相关字段(如features、config_change_pending)的并发读写
* @vqs_list_lock: 虚拟队列链表自旋锁,保护vqs链表的增删/遍历操作(防止多线程操作队列链表竞态)
* @dev: 内核通用设备结构体,将virtio设

最低0.47元/天 解锁文章
1849

被折叠的 条评论
为什么被折叠?



