博客
关于我
【原创】Linux虚拟化KVM-Qemu分析(十)之virtio驱动
阅读量:402 次
发布时间:2019-03-06

本文共 1433 字,大约阅读时间需要 4 分钟。

背景

本文将深入探讨Guest OS(Linux)中Virtio框架的Virtio Driver,具体聚焦于Virtio网桥驱动的实现流程和框架架构。前文已详细介绍了QEMU中Virtio设备的创建,本文将从Virtio驱动的角度,分析其在Linux内核中的实现细节。

1. 概述

本文将从Virtio框架的高层架构图入手,分析Virtio驱动的实现细节。Virtio框架的核心模块包括virtiovirtqueue,其他高层驱动均基于这些核心模块构建。本文将重点分析virtio-net驱动的实现流程,结合PCI设备模型,探讨Virtio驱动的组织结构和功能实现。

2. 数据结构

Virtio驱动的实现离不开Linux内核中的设备驱动模型,尤其是PCI设备模型。内核通过virtio_bus创建Virtio总线,负责设备与驱动的匹配。Virtio设备通过virtio_device_id与驱动进行匹配,Virtio规范定义了设备ID和功能集。Virtio设备的核心结构包括struct virtio_config_ops功能集,用于定义设备操作回调函数。

在Linux内核中,Virtio-PCI设备通过struct virtio_pci_device进行组织,该结构体维护了四个IO区域:Common、ISR、Device、Notify,用于获取和处理Virtio设备的各种操作请求。Virtio设备通常包含设备状态字段、特性位、通知机制、设备配置空间以及一或多个Virtqueues。

3. 流程分析

3.1 virtio总线创建

Virtio总线的创建是整个Virtio驱动生命周期的第一步。在Linux内核中,Virtio总线通过bus_register函数注册,总线负责匹配Virtio设备与对应的驱动。当Virtio设备的ID与驱动匹配时,总线会调用virtio_dev_probe函数,触发Virtio驱动的初始化流程。

3.2 virtio驱动调用流程

Virtio-PCI设备的驱动初始化流程主要包括以下几个关键步骤:

  • 设备枚举:系统在PCI子系统初始化时会枚举所有PCI设备,并将枚举结果注册到系统中。
  • 设备匹配:根据设备的Vendor ID和Device ID,调用对应的驱动入口函数virtio_pci_probe
  • 设备初始化:通过struct virtio_pci_device结构体完成Virtio设备与PCI设备的绑定,初始化各个功能模块。
  • 功能能力映射:调用virtio_pci_modern_probe函数,通过virtio_pci_find_capability获取Virtio规范定义的功能能力,并完成IO空间的映射。
  • 功能集注册:设置virtio_pci_config_ops操作函数集,定义Virtio设备的特性操作回调函数。
  • 设备注册:调用register_virtio_device函数,将Virtio设备注册到系统中,触发Virtio总线的匹配流程。
  • 设备探测:virtio_dev_probe函数根据Virtio规范分阶段设置设备状态、获取特性信息,并调用实际设备驱动程序。
  • 参考

    更多关于Virtio规范和实现细节,可以参考以下链接:

    https://developer.ibm.com/technologies/linux/articles/l-virtio/

    欢迎关注个人公众号,获取更多技术文章更新。

    转载地址:http://gxzkz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现degreeToRadian度到弧度算法(附完整源码)
    查看>>
    Objective-C实现depth first search深度优先搜索算法(附完整源码)
    查看>>
    Objective-C实现des文件加密算法(附完整源码)
    查看>>
    Objective-C实现deutsch jozsa算法(附完整源码)
    查看>>
    Objective-C实现DFS判断是否是二分图Bipartite算法(附完整源码)
    查看>>
    Objective-C实现Diffie-Hellman算法(附完整源码)
    查看>>
    Objective-C实现Dijkstra最小路径算法(附完整源码)
    查看>>
    Objective-C实现dijkstra迪杰斯特拉算法(附完整源码)
    查看>>
    Objective-C实现Dijkstra迪杰斯特拉算法(附完整源码)
    查看>>
    Objective-C实现dijkstra银行家算法(附完整源码)
    查看>>
    Objective-C实现Dinic算法(附完整源码)
    查看>>
    Objective-C实现disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现DisjointSet并查集的算法(附完整源码)
    查看>>
    Objective-C实现djb2哈希算法(附完整源码)
    查看>>
    Objective-C实现DNF排序算法(附完整源码)
    查看>>
    Objective-C实现doomsday末日算法(附完整源码)
    查看>>
    Objective-C实现double factorial iterative双阶乘迭代算法(附完整源码)
    查看>>
    Objective-C实现double factorial recursive双阶乘递归算法(附完整源码)
    查看>>
    Objective-C实现double hash双哈希算法(附完整源码)
    查看>>
    Objective-C实现double linear search recursion双线性搜索递归算法(附完整源码)
    查看>>