Linux Kernel Vhost 架构
Vhost 回顾
Linux中的vhost驱动程序提供了内核virtio设备仿真。 通常,QEMU用户空间进程模拟guest的I / O访问。 Vhost将virtio仿真代码放到内核中,使QEMU用户空间脱离。 这允许设备仿真代码直接调用到内核子系统,而不是从用户空间执行系统调用。
vhost-net驱动程序模拟主机内核中的virtio-net网卡。 Vhost-net是最早的vhost设备,也是主流Linux中唯一可用的设备。 也已经开发了实验vhost-blk和vhost-scsi装置。
在Linux 3.0中,vhost代码存放在drivers / vhost /中。 所有设备使用的通用代码在drivers / vhost / vhost.c中。 这包括virtio vring访问功能,所有virtio设备需要为了与客户进行通信。 vhost-net代码存放在drivers / vhost / net.c中。
Vhost 驱动模型
vhost-net驱动程序在主机上创建一个/ dev / vhost-net字符设备。 此字符设备作为配置vhost-net实例的接口。
当使用-netdev tap启动QEMU时,vhost = on将打开/ dev / vhost-net并使用几个ioctl调用初始化vhost-net实例。 这些必须将QEMU进程与vhost-net实例关联,准备virtio功能协商,并将guest虚拟机物理内存映射传递到vhost-net驱动程序。
在初始化期间,vhost驱动程序创建一个名为vhost- $ pid的内核线程,其中$ pid是QEMU进程pid。 这个线程被称为“vhost工作线程”。 工作线程的任务是处理I / O事件并执行设备仿真。
内核Virtio仿真
Vhost不会模拟一个完整的virtio PCI适配器。 相反,它只将自己限制为virtqueue操作。 QEMU仍然用于执行virtio特性协商和实时迁移。 这意味着vhost驱动程序不是完整的virtio设备实现,它依赖于用户空间来处理控制平面,而数据平面在内核中完成。
vhost工作线程等待virtqueue kick,然后处理放在virtqueue上的缓冲区。 在vhost-net这意味着从tx virtque的数据包并且通过tap文件描述符发送它们。
文件描述符轮询也由vhost工作线程完成。 在vhost-net中,当数据包进入tap文件描述符时,工作线程被唤醒,并将其放置到rx virtqueue中,以便客户端可以接收它们。
Vhost作为用户空间接口
vhost架构的一个令人惊讶的方面是它不以任何方式绑定到KVM。 Vhost是一个用户空间接口,不依赖于KVM内核模块。这意味着其他用户空间代码(如libpcap)在理论上可以使用vhost设备,如果他们发现它们方便的高性能I / O接口。
当客户端kick主机,因为它已经将缓冲区放在一个virtqueue,需要一种方式来通知vhost工作线程有工作要做。由于vhost不依赖于KVM内核模块,它们不能直接通信。相反,vhost实例使用vhost工作线程监视活动的eventfd文件描述符进行设置。 KVM内核模块具有称为ioeventfd的功能,用于获取eventfd并将其挂接到特定的guest虚拟机I / O出口。 QEMU用户空间注册一个ioeventfd用于VIRTIO_PCI_QUEUE_NOTIFY硬件寄存器访问,它能kick virtqueue。这是当guest虚拟机kick virtqueue,vhost工作线程被KVM内核模块通知的方式。
在从vhost工作线程返回到中断客户端时,使用了类似的方法。 Vhost需要一个“call”文件描述符,写这个文件描述符是为了去kick guest。 KVM内核模块有一个称为irqfd的功能,它允许eventfd触发客户机中断。 QEMU用户空间注册一个irqfd为virtio PCI设备中断并将其交给vhost实例。这是vhost工作线程如何中断客户端。
因此,vhost实例只知道guest虚拟机内存映射,kick eventfd和call eventfd。
More detail
drivers / vhost / vhost.c - 常见的vhost驱动程序代码
drivers / vhost / net.c - vhost-net驱动
virt / kvm / eventfd.c - ioeventfd和irqfd
QEMU用户空间代码显示如何初始化vhost实例:
hw / vhost.c - 常见的vhost初始化代码
hw / vhost_net.c - vhost-net初始化
Linux Kernel Vhost 架构的更多相关文章
- Linux Kernel 4.21已更新:优化AMD 7nm Zen2架构
导读 AMD 7nm Zen2处理器预计将于明年第一季推出,采用下一代7nm EPYC. Linux Kernel 4.21已经更新,以优化AMD 7nm EPYC Rome(罗马)处理器. AMD ...
- Linux kernel make 常用选项介绍
Linux kernel 编译方法大全记录 一.这是一个我自己写的自动make脚本: #!/bin/sh export ARCH=arm export CROSS_COMPILE=arm-linux- ...
- linux kernel 杂谈
首先介绍一下背景吧,工作三个星期了.复习了一波u-boot,跟了一下事件上报,搞了下平台设备,扣了一个内存检查代码. 想想生活是不是有点无聊.对啊,真的很无聊!!!! 无聊也没有办法啊,所以找点方法去 ...
- Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux
目录 . sys_call_table:系统调用表 . 内核符号导出表:Kernel-Symbol-Table . Linux 32bit.64bit环境下系统调用入口的异同 . Linux 32bi ...
- Intel 80x86 Linux Kernel Interrupt(中断)、Interrupt Priority、Interrupt nesting、Prohibit Things Whthin CPU In The Interrupt Off State
目录 . 引言 . Linux 中断的概念 . 中断处理流程 . Linux 中断相关的源代码分析 . Linux 硬件中断 . Linux 软中断 . 中断优先级 . CPU在关中断状态下编程要注意 ...
- Linux Kernel 4.8分支第4个候选版本发布
导读 今天,大神Linus Torvalds宣布了Linux 4.8分支的第四个候选版本,该候选版本在提供常规驱动更新.架构改善和部分KVM调整之外最大的新功能就是修复了英特尔Skylake电源管理B ...
- Linux Kernel Schduler History And Centos7.2's Kernel Resource Analysis
本文分为概述.历史.el7.2代码架构图解三部分. 解决的问题: a.Kernel调度发展过程: b.以架构图的方式,详解el7.2具体调度实现.内核线程模型.调度时间片计算,以及探究整个Kernel ...
- linux驱动程序之电源管理之新版linux系统设备架构中关于电源管理方式的变更
新版linux系统设备架构中关于电源管理方式的变更 based on linux-2.6.32 一.设备模型各数据结构中电源管理的部分 linux的设备模型通过诸多结构体来联合描述,如struct d ...
- andriod and linux kernel启动流程
虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makefile,讲一下boot ...
随机推荐
- C# 操作 Excel 常见问题收集和整理
C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流) 经常会有项目需要把表格导出为 Excel 文件,或者是导入一份 Excel 来操作,那么如何在 C# 中操作 Excel 文件成了一个 ...
- 闭包、lambda和interface
闭包.lambda和interface 人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只 ...
- JVM内存管理学习总结(一)
I.JVM进程的生命周期 JVM实例的生命周期和java程序的生命周期保持一致,即一个新的程序启动则产生一个新的JVM进程实例,程序结束则JVM进程实例伴随着消失.那么程序启动和程序终止就是JVM实例 ...
- VS2012编译LibZip库
LibZip库是解压缩zip文件的C库. 中文的网站目前还没有找到相关的编译方法,找了一篇英文文档加上自己的实验修改了一下: 编译步骤如下: 首先先下载CMake,我下载的是2.8版本. libzip ...
- 打破惯性思维:聊聊一次debug
最近公司的新需求中要增加活动营销,整个组的人都被安排去研究某成熟产品的实现.我也认真地在看webService部分的实现,发现了一个诡异的10614端口的请求. 代码如下图: 这是一段服务端发请求验证 ...
- Java构造器的深入理解
[构造器与方法的深入理解] 构造器的深入理解 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 [博客地址]http://www.cnblogs.com/grl2 ...
- java基础练习 8
public class Eighth { /*判断101-200之间有多少个素数,并输出所有素数.素数又叫质数,就是除了1和它本身之外,再也没有整数能被它整除的数.也就是素数只有两个因子.*/ pu ...
- (八)python的简单数据类型和变量
什么是数据类型? 程序的本质就是驱使计算机去处理各种状态的变化,这些状态分为很多种. 例如英雄联盟游戏,一个人物角色有名字,钱,等级,装备等特性,大家第一时间会想到这么表示 名字:德玛西亚------ ...
- 【CentOS如何最小化安装】
近来发现越来越多的运维小伙伴们都有最小化安装系统的洁癖,因此,找老男孩来咨询,这个"洁癖"好习惯啊,必须支持,,因此发布本文和大家分享下. (1)系统安装类型选择及自定义额外包组 ...
- sequekize
关于sequelize的准备工作这里不再赘述. 一.引入sequelize模块 var Sequelize = require('sequelize'); 二.连接数据库 var sequelize ...