virtio设备状态

2023-11-03 20:30
文章标签 状态 设备 virtio

本文主要是介绍virtio设备状态,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

spec描述

驱动初始化探测的大致过程:

virtio_pci_probe->pci_enable_device->virtio_pci_modern_probe->register_virtio_device->virtio_dev_probe

virtio_pci_modern_probe->设置回调vp_config_vector->设置回调setup_vq

drivers/virtio/virtio_pci_common.c

virtblk_probe->init_vq(virtio_blk.c)->virtio_find_vqs->find_vqs->vp_modern_find_vqs->vp_find_vqs->vp_find_vqs_msix->vp_request_msix_vectors->vp_setup_vq->setup_vq->request_irq->vring_interrupt

virtnet_probe->init_vqs->virtnet_find_vqs->find_vqs->同上

例如virtio_net驱动中用于初始化queue,创建网络设备并初始化一些必要的数据结构

当后端模拟出virtio_net设备后,驱动扫描到virtio设备,然后调用virtio_pci_driver中virtio_pci_probe函数完成pci设备的启动。

注册一条virtio_bus,同时在virtio总线进行注册设备。当virtio总线进行注册设备register_virtio_device,设置virtio总线后将调用virtio总线的probe函数:virtio_dev_probe。

该函数遍历驱动,找到支持驱动关联到该设备并且调用

virtio_driver probe,virtnet_probe函数

static int virtio_dev_probe(struct device *_d)
{int err, i;struct virtio_device *dev = dev_to_virtio(_d);struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);u64 device_features;u64 driver_features;u64 driver_features_legacy;/* We have a driver! */virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER);//置位状态,知道是什么驱动/* Figure out what features the device supports. * 回调函数vp_get_features->vp_modern_get_features* vp_modern_get_features 中会和后端设备协商feature*/device_features = dev->config->get_features(dev);/* Figure out what features the driver supports. */driver_features = 0;for (i = 0; i < drv->feature_table_size; i++) {unsigned int f = drv->feature_table[i];BUG_ON(f >= 64);driver_features |= (1ULL << f);}/* Some drivers have a separate feature table for virtio v1.0 */if (drv->feature_table_legacy) {driver_features_legacy = 0;for (i = 0; i < drv->feature_table_size_legacy; i++) {unsigned int f = drv->feature_table_legacy[i];BUG_ON(f >= 64);driver_features_legacy |= (1ULL << f);}} else {driver_features_legacy = driver_features;}if (device_features & (1ULL << VIRTIO_F_VERSION_1))dev->features = driver_features & device_features;elsedev->features = driver_features_legacy & device_features;/* Transport features always preserved to pass to finalize_features. */for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++)if (device_features & (1ULL << i))__virtio_set_bit(dev, i);if (drv->validate) {err = drv->validate(dev);if (err)goto err;}// 协商结果,成功会置位VIRTIO_CONFIG_S_FEATURES_OK,表示前后端协商成功err = virtio_finalize_features(dev);if (err)goto err;err = drv->probe(dev); //virtio_drive回调函数 virtnet_probe 或者 virtblk_probeif (err)goto err;/* If probe didn't do it, mark device DRIVER_OK ourselves. */if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK))virtio_device_ready(dev);if (drv->scan)drv->scan(dev);virtio_config_enable(dev);return 0;
err:virtio_add_status(dev, VIRTIO_CONFIG_S_FAILED);return err;}

下面分别描述探测过程中几个状态的前端发生过程。

VIRTIO_CONFIG_S_ACKNOWLEDGE

前端:

virtio_pci_probe ->register_virtio_device

->virtio_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);//通知后端已发现此virtio设备

后端

todo

VIRTIO_CONFIG_S_DRIVER

virtio_dev_probe->virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER)

VIRTIO_CONFIG_S_FEATURES_OK

virtio_dev_probe->>virtio_finalize_features

virtio_add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);

VIRTIO_CONFIG_S_DRIVER_OK

virtio_dev_probe->virtio_device_ready-

dev->config->set_status(dev, status | VIRTIO_CONFIG_S_DRIVER_OK);

后端:(以qemu为例)

 hw/virtio/virtio-pci.c: virtio_pci_bus_class_init->virtio_pci_device_plugged->

virtio_pci_modern_regions_init->virtio_pci_common_write->

    case VIRTIO_PCI_COMMON_STATUS:if (!(val & VIRTIO_CONFIG_S_DRIVER_OK)) {virtio_pci_stop_ioeventfd(proxy);}virtio_set_status(vdev, val & 0xFF);if (val & VIRTIO_CONFIG_S_DRIVER_OK) {virtio_pci_start_ioeventfd(proxy);//启动ioeventfd}if (vdev->status == 0) {virtio_pci_reset(DEVICE(proxy));}

这篇关于virtio设备状态的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/340703

相关文章

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

录音功能在哪里? 电脑手机等设备打开录音功能的技巧

《录音功能在哪里?电脑手机等设备打开录音功能的技巧》很多时候我们需要使用录音功能,电脑和手机这些常用设备怎么使用录音功能呢?下面我们就来看看详细的教程... 我们在会议讨论、采访记录、课堂学习、灵感创作、法律取证、重要对话时,都可能有录音需求,便于留存关键信息。下面分享一下如何在电脑端和手机端上找到录音功能

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

嵌入式Linux之使用设备树驱动GPIO的实现方式

《嵌入式Linux之使用设备树驱动GPIO的实现方式》:本文主要介绍嵌入式Linux之使用设备树驱动GPIO的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、设备树配置1.1 添加 pinctrl 节点1.2 添加 LED 设备节点二、编写驱动程序2.1

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与