细说Linux虚拟化KVM-Qemu之virtio驱动
创始人
2024-05-21 10:38:13
0

说明:

  1. KVM版本:5.9.1
  2. QEMU版本:5.0.0
  3. 工具:Source Insight 3.5, Visio

1. 概述

  • 前篇文章讲完了Qemu中如何来创建Virtio Device,本文将围绕Guest OS中的Virtio Driver来展开;

看一下Guest OS(Linux)中的Virtio框架高层架构图:

  • 核心模块为virtio和virtqueue,其他高层的驱动都是基于核心模块之上构建的;
  • 显然,本文会延续这个系列,继续分析virtio-net驱动,重心在整体流程和框架上,细节不表;
  • virtio-net,又是一个virtio设备,又是一个PCI设备,那么驱动会怎么组织呢?带着问题上路吧。

  资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

2. 数据结构

说到驱动怎么能不提linux设备驱动模型呢,感兴趣的朋友可以去看看PCI系列分析文章,简单来说就是内核创建总线用于挂载设备,总线负责设备与驱动的匹配。Linux内核创建了一个virtio bus:

  • virtio设备和virtio驱动,通过virtio_device_id来匹配,而这个都是在virtio规范中定义好的;
  • virtio_device结构中有一个struct virtio_config_ops,函数集由驱动来进行指定,用于操作具体的设备;

 

本文描述的virtio-net驱动,既是一个virtio设备,也是一个pci设备,在内核中通过结构体struct virtio_pci_device来组织:

  • 该结构体中维护了几个IO区域:Common, ISR, Device, Notify,用于获取virtio设备的各种信息,这个也是由virtio规范决定的;
  • 通常来说一个virtio设备,由以下几个部分组成:
  • Device status field
  • Feature bits
  • Notifications
  • Device Configuration space
  • One or more virtqueues
  • 从结构体看,它用于充当pci设备和virtio设备的纽带,后续也会在probe函数中针对不同的部分进行对应的初始化;

以总线的匹配视角来看就是这样子的:

3. 流程分析

3.1 virtio总线创建

先看一下virtio总线的创建,virtio bus当然也算是基建了:

  • bus_register注册virtio总线,总线负责匹配,在匹配成功后调用通用的virtio_dev_probe函数;
  • 千里姻缘一线牵,当Virtio的ID号能对上时,就会触发驱动探测,所以什么时候进行设备注册呢?

3.2 virtio驱动调用流程

详细的细节,建议阅读之前PCI驱动系列的分析文章,下边罗列关键部分:

  • virtio-net设备通过挂在pci总线上,系统在PCI子系统初始化时会去枚举所有的设备,并将枚举的设备注册进系统;
  • 系统在匹配上之后,调用设备的驱动;

  • PCI设备根据Vendor ID来匹配驱动;
  • virtio规范中规定基于PCI的virtio设备,Vendor ID号为:0x1AF4,因此最终调用的驱动入口为virtio_pci_probe;

  • 在probe函数中分配struct virtio_pci_device结构,前文中也提到过它负责将virtio设备和pci设备绑定到一起,最终会在两个设备驱动的probe函数中完成整体结构的初始化,也就是virtio_pci_probe完成一部分,实际的virtio设备驱动中完成一部分;
  • virtio_pci_modern_probe:该函数的内容就与virtio规范紧密相关了,简单来说,virtio设备都会按照规范填充common、device、isr、notification等功能部分,而virtio_pci_modern_probe函数通过virtio_pci_find_capability去获取对应的能力,并且通过map_capability完成IO空间的映射;
  • virtio_pci_probe中还设置了virtio_pci_config_ops操作函数集,并传递给virtio驱动,在驱动中调用这些回调函数来操作virtio设备;
  • register_virtio_device:向系统注册virtio设备,从而也就触发了virtio总线的匹配操作,最终调用virtio_dev_probe函数;
  • virtio_dev_probe函数中按照virtio规范分阶段设置不同的状态、获取virtio设备的feature等,并最终调用实际设备的驱动程序了;

 

相关内容

热门资讯

夏日情缘初中作文(最新5篇) 夏日情缘初中作文 篇一夏日的阳光炙热,热得令人汗流浃背。然而,在这个炎热的夏季,我经历了一段令人难忘...
不再迷茫初中作文(精彩6篇) 不再迷茫初中作文 篇一初中生活是人生中一个重要的阶段,对于很多同学来说,初中生活充满了挑战和困惑。然...
初中毕业作文(推荐6篇) 初中毕业作文 篇一我的初中生活初中生活即将结束,回首这三年的时光,我不禁感慨万分。这段时间,我经历了...
初中新生活【优选6篇】 初中新生活 篇一初中新生活带给我许多新鲜感受和挑战。从进入初中的第一天起,我就感受到了与小学完全不同...
我的初一生活作文800字(优... 我的初一生活作文800字 篇一初一生活,是我人生中的一段重要时光。刚升入初中的我,面对新环境和新生活...
我的烦恼作文800字初一【精... 我的烦恼作文800字初一 篇一我对自己的学习成绩感到很烦恼。尽管我努力学习,但总是无法取得理想的成绩...
残缺也美丽初中作文【精简5篇... 残缺也美丽初中作文 篇一残缺也美丽人生如同一场旅行,每个人都扮演着不同的角色,经历着不同的风景。有时...
我的眼里只有你优秀作文(经典... 我的眼里只有你优秀作文 篇一在我的眼里,只有你是最优秀的。你是我最敬爱的人,也是我最佩服的人。无论是...
经典议论文(最新6篇) 经典议论文 篇一:商业竞争对市场发展的影响商业竞争是市场经济中不可避免的现象,对市场发展起着重要的推...
谈面子议论文【优秀5篇】 谈面子议论文 篇一面子在中国文化中一直扮演着重要的角色,它是人们社会地位和尊严的象征。因此,面子议论...
初一的女孩_(精选6篇) 初一的女孩_ 篇一初一的女孩初一的女孩,正值少女青春期的开始,充满了好奇心和朝气。在这个阶段,她们开...
初中生科幻作文:机器猫(最新... 初中生科幻作文:机器猫 篇一机器猫我叫小明,是一个普通的初中生。有一天,我意外地发现了一只神奇的机器...
初一军训作文(推荐3篇) 初一军训作文 篇一初一军训是每个初中生的必修课程,也是我们适应新环境、锻炼意志的一次重要机会。我国历...
寒梅墨香初中作文500字(精... 寒梅墨香初中作文500字 篇一:寒梅墨香寒梅墨香,这是我最喜欢的一句诗句。每当我看到这句诗时,心中就...
仰望星空,脚踏实地作文650... 仰望星空,脚踏实地作文650字 篇一仰望星空,脚踏实地星空,是人类永远的向往和追求。每当夜幕降临,我...
我的忏悔初中作文【精简5篇】 我的忏悔初中作文 篇一我曾经做出了一件让我深感愧疚的事情,我想在这里向大家忏悔并寻求原谅。那是一个晴...
生活中的语言_初中记叙文【经... 生活中的语言_初中记叙文 篇一我和爸爸妈妈一样,是普通的工薪阶层,生活虽然平凡,但却充满了各种语言的...
初一我的奋斗目标作文500字... 初一我的奋斗目标作文500字 第一篇俗话说:“你脸上云淡风轻,谁也不知道你呼吸得有多紧;你走路带风,...
谢谢你让我遇见你作文(精彩5... 谢谢你让我遇见你作文 篇一遇见你,是我这一生最美好的偶遇。谢谢你,让我在茫茫人海中找到了属于我的那份...
那道靓丽的风景线作文700字... 那道靓丽的风景线作文700字 篇一那道靓丽的风景线在我家附近有一道靓丽的风景线,它是一条蜿蜒曲折的小...