virtio-blk请求发起

virtio-blk后端处理-请求接收、解析、提交 在“virtio-blk后端处理”这一系列中将分析Qemu对guest中发送过来的请求是如何进行处理的。大致想了下。这个系列分成如下几个部分: - Qemu接收、解析、提交请求 - IOThread中的处理 - 执行请求 - 请求完成 - dataplane情况下的处理这个文件是这系列的第一部分,主要分析Qemu收到请求到将其派发到线程的过程。这是不考虑dataplane的情况 现在Qe 阅读详情

vitrio-blk请求发起

source code:3.19.3
较新的内核中(从哪个版本开始的没去考证)virtio-blk使用了blk-mq模型,先看一下virtio-blk初始化的时候的和blk-mq相关的设置(在virtblk_probe函数中):
1.blk-mq回调函数族:

        vblk->tag_set.ops = &virtio_mq_ops;

ops是blk-mq模型中关键的一组回调函数,至少要保证设置其中的queue_rq和map_queue
queue_rq函数简单来说就是指明如何处理请求
map_queue函数负责sw queue到hw queue的映射
而virtio_mq_ops中将两者分别设置为* virtio_queue_rq函数和 blk_mq_map_queue函数*,前者是我们需要关注的,后者是blk-mq中提供的一种默认映射(目前基本上都是使用这种映射关系)

2.队列深度:

        vblk->tag_set.queue_depth = virtblk_queue_depth;

queue_depth表示硬件队列的深度,这里将其设置为virtblk_queue_depth,而它又和virtqueue结构的num_free有关系(只是和初始化时期的num_free有关系,因为后面在请求处理过程中num_free会变化):

    /* Default queue sizing is to fill the ring. */
    if (!virtblk_queue_depth) {
        virtblk_queue_depth = vblk->vqs[0].vq->num_free;
        /* ... but without indirect descs, we use 2 descs per req */
        if (!virtio_has_feature(vdev, VIRTIO_RING_F_INDIRECT_DESC))
            virtblk_queue_depth /= 2;
    }

3.“请求”额外所需大小:

    vblk->tag_set.cmd_size =
        sizeof(struct virtblk_req) +
        sizeof(struct scatterlist) * sg_elems;

在blk-mq模型中,硬件队列对应了一个“请求数组”,该数组中的元素表示“请求”,而这个“请求”的大小是sizeof(request)+cmd_size。这里对cmd_size进行了设置,从这个设置中我们也可以意识到virtio-blk的“请求”结构是:首先是一个struct request,紧接着是struct virtblk_req,最后是一个聚散列表。如图所示:
这里写图片描述

4.硬件队列数量:

    vblk->tag_set.nr_hw_queues = vblk->num_vqs;

nr_hw_queues表示硬件队列的数量,这里将它设置为virtqueue的数量。

函数调用关系

这里写图片描述

virtio_queue_rq函数

1.需要明确的是这个函数是在blk-mq对请求处理的流程中被调用的,执行到这里的时候struct request对象是存储在blk-mq的hardware queue中的。
2.这个函数有两个参数:hctx指向这个请求所在的hardware queue;bd指向了一个blk_mq_queue_data对象,该对象也是blk-mq层在调用queue_fn之前准备好了的。

主要流程:
1.初始化部分局部变量:
- 获得这个硬件队列对应的virtio_blk对象,该对象的指针存在request_queue结构的queuedata域中(在virtblk_probe函数中设置的:q->queuedata = vblk)。
- 从传进来的blk_mq_queue_data中取出我们要处理的请求放在req中。
- 得到virtblk_req的地址(从前面的“请求”图中看到可以轻松的计算出来)存放在vbr变量中。

2.设置vbr的out_hdr对象(该对象用来向后端描述这次请求),需要根据request对象的cmd_flags、cmd_type来决定如何设置out_hdr。

3.调用* blk_rq_map_sg函数*,根据request对象的信息来设置scattelist,该函数返回在scatterlist中设置了多少项存在局部变量num中。

4.如果num不为零,则说明这个request涉及到数据的传输,既然是有数据传输就势必需要确定传输的方向:如果是写操作就需要设置VIRTIO_BLK_T_OUT标志,表明是往外送数据;否则就设置VIRTIO_BLK_T_IN标志,表明需要从外部读入数据。

5.调用* __virtblk_add_req函数*将和此request相关的一些信息加到vring中。

6.如果需要的话调用virtquue_notify函数通知后端(QEMU),该函数主要是virtqueue中的notify回调函数,在virtio-blk中该回调函数对应的是vp_notify函数。
在vp_notify函数中通过io_write函数将virtqueue的编号写到相应的内存中(由virtqueue的priv域指定,该域在初始化的时候被设置为vp_dev->ioaddr + VIRTIO_PCI_QUEUE_NOTIFY,可以看出这个地址是virtio专门用来前端后端互相通知的地址),向后端表明该处理哪个虚拟队列了。这里通过MMIO的形式VM exit到host去处理。

blk_rq_map_sg函数

主要流程:
1.调用* __blk_bios_map_sg函数*根据这个request对象中隐含的bios链表中的bio来设置sglist。该函数会返回sglist中设置了的表项的数目,并且传递给它的参数sg会被设置为指向最后一个设置了的表项。

2.有的设备存在“excess DMA”的问题,如果是这样的话必须在散列表后面追加一个“抽干缓冲区”,用于存放那些无意义的数据。

3.调用sg_mark_end函数设置scatterlist的末尾表项的结束标志,最后返回scatterlist中设置了的表项的数目。

__blk_bios_map_sg函数

此函数负责从bio构建出一个scatterlist,因为一个request可以对应多个bio,所以这里处理的不仅仅是传入的bio,还会继续它的下一个bio直到末尾。
sglist:表示我们要设置的那张scatterlist。
sg:当这个函数执行完成之后,sg就是指向了最后一个有用scatterlist表项。
它返回scatterlist中实际设置了多少个项。
主要流程:
1.如果bio设置了REQ_WRITE_SAME标志,表示多次读写同一个块,那么只需要设置一个scatterlist表项(因为如果这个bio后面还跟随了其他bios,那么肯定也是写同一个位置的,这是merge操作决定的)并返回1。

2.对这个bio链中的* 每个bio的每个segment调用__blk_segment_map_sg函数*,逐段的设置scatterlist。

3.返回nsegs(scatterlist中使用了的表项数目)

__blk_segment_map_sg函数

bvec:当前要“转换”(根据bio_vec设置scatterlist表项)的bio_vec
sglist:表示我们要设置的那张聚散列表
bvprv:用来保存前一个segment
sg:用于存储前一个聚散表表项
nsegs:用来存储目前设置了多少个表项
主要流程:
1.如果 *sg 不为空(只有第一次才可能为空),说明前面存在scatterlist表项,尝试bvec能否和前一个合并:
- 合并之后的大小不能超过request_queue的limits限制的最大段大小
- 两者所描述的physical address必须能够衔接起来
- 合并后的段的地址必须符合limits中段界限要求

只有上面的三个条件都满足才能认为是可以合并的,此时只需修改 *sg 中的长度即可,然后跳至第4步;否则的则需要使用一个新段。

2.如果 *sg 为空,说明这是第一次进来设置sglist,那么就将它赋值为sglist;否则的话,将它赋值为下一个表项。这时,sg的作用有了改变,它现在指向这个bvec要使用的scatterlist表项。

3.调用sg_set_page函数设置该表项,并递加nsegs的值。

4.最后将bvprv设置为这个bvec(这样下次进入这个函数时bvprv就成了指向前一个段的指针)

__virtblk_add_req函数

data_sg:表示用于实际IO操作的scatterlist
主要流程:
1.根据情况(可能有的不需要)构建一张scatterlist,这张表中依次存储下列表项:前面提到过的out_hdr、request->cmd、data_sg、request->sense、in_hdr、status,可以看到这张scatterlist中将信息输出的放在前面、信息输入的放在后面。除此之外,用num_out记录信息输出的项数、num_in记录信息输入的项数。

2.调用* virtqueue_add_sgs函数:在该函数中先计算出总共有多少个scatterlist(不仅仅是钢num_out+num_in,因为其中的data_sg中包含的项数也会被计算进去),然后直接调用 virtqueue_add函数*来“写到”vring中。

virtqueue_add函数
  • 参数sgs代表上面__virtblk_add_req函数中创建的那张最多包含6个表项的scatterlist(其中data_sg指向的是实际IO操作需要的scatterlist)
  • 参数data,可能不同virtio设备有不同用处,针对virtio-blk,它是一个在virtio_queue_rq函数的第1步中构造的那个virtblk_req对象
  • 此函数中主要对vring进行操作,里面涉及到得域比较多,下面重新梳理vring_virtqueue、vring、virtqueue三者的关系(图中只列出了此函数中会使用到的域):
    这里写图片描述
    struct vring_virtqueue:
    此结构中包含了一个struct vring对象vring、一个struct virtqueue对象vq
    free_head表示vring中的desc所指向的desc table中空闲descriptor链表的首元素的索引
    num_added表示从上次后端处理了请求到现在guest向vring中提交了多少次请求
    struct vring:
    num表示的是最大支持多少个segment
    struct virtqueue:
    num_free表示vring的desc table中空闲descriptor的数目

主要流程:
1.如果支持indirect descriptor table,并且本次需要加入vring的有超过1个的scatterlist表项,并且vring中还有空闲的descriptor,则调用alloc_indirect函数分配一个indirect descriptor table。(indirect descriptor table的作用是来增加数据传输效率的)

2.如果使用了indirect,那么我们只需要占用vring中的desc table的一项就可以了(占用空闲中的首项),于是需要对该项赋值:addr等于indirect desc table的地址、len等于indirect desc table的大小(字节为单位);否则的话就只能使用vring中的desc table的total_sg个空闲项。
将所需要的vring中的desc table中空闲项的数目存储在局部变量descs_used中。

3.需要确保desc table中的空闲项数目不小于descs_used。
因为我们将要占用descs_used个空闲项,因此调整virtqueue的num_free,减去descs_used。

4.根据传递给此函数的scatterlist填充descriptor table:对于使用indirect的则填充indirect desc table;未使用indirect(即使用vring中desc table)的则填充vring中的desc table。

5.调整vring_virtqueue的free_head:根据是否使用indirect进行调整、调整的幅度肯定不同。

6.调整vring的avail:将这从请求在desc table中的入口索引记录在vring的avail域中。

7.递加virng_virtqueue的num_added,如果它的值等于(1<<16)-1,那么我们就需要调用virtqueu_kick函数痛处后端来处理了,因为已经提交了太多次了(如果太多次了还不kick后端的话可能会使vring中充满了请求数据而后续的请求没法加进来、进而影响了IO性能)

8.返回0表示成功

block多队列分析 - 2. block多队列的初始化 目录1. 前言1. null_init|- -blk_mq_alloc_tag_set|- -blk_mq_init_queue_data 1. 前言 本专题文章是对多队列部分学习的笔记。主要以null_dev为例来研究多队列的工作机制, 为了能够凸显多队列的工作流程,只对block层做重点分析说明,对其它代码只做注释性说明。本文主要通过分析null blk块设备的初始化流程,来理解多队列的初始化,流程。 kernel版本:5.10 平台:arm64 注: 为方便阅读,正文标题采用分级结构标识,每一级用一 阅读详情

相关推荐

VENOM漏洞深度解析:QEMU virtio-blk边界越界与虚拟化逃逸防御

虚拟机监控器(VMM)通过设备模拟实现I/O抽象,是虚拟化安全的关键枢纽;其核心原理在于用户态模拟器(如QEMU)与内核态Hypervisor(如KVM)的职责分离——KVM仅处理CPU/内存虚拟化,而QEMU负责全设备模拟,这也使其成为攻击面集中区。当virtio-blk等模拟组件缺失输入校验时,极易引发内存越界写,进而导致宿主机逃逸。该类漏洞技术价值极高,因其不依赖内核提权,可绕过传统隔离机制,在云平台、WSL2、嵌入式QEMU等广泛场景中持续生效。本文聚焦CVE-2015-3456(VENOM)这一典

www.itmmd.com 447

VirtIO实现原理——virtblk设备初始化

本文以virtio-blk为例,介绍virtio设备在前端的初始化流程,以及后端相应的流程分析。对virtio-blk设备feature的配置以及应用在另一篇文章中介绍。

Take Easy,Work Hard! 1万+

virtio驱动_virtio 虚拟化系列之一:从 virtio 论文开始

背景Virtio 来源于 virtio: towards a de-facto standard for virtual I/O devices 这篇论文[1]。论文发表于 2008 年,已经十来年了,但是它的设计思想依旧不过时,今天来重读一下此文,看看 virtio 是如何统一半虚拟化的。在那个时代(2008),Linux 作为 Guest OS 已经被多个系统支持,以及用户模式的 Linux ...

weixin_39937447的博客 529

Linux kernel | scsi层是如何处理zone相关request的

上文中,我们将提交了submit_bio后的流程进行了分析,经过梳理之后,一个submit_bio在经过层层转化,最后进入到硬件派发队列hctx时,会调用硬件绑定的驱动所提供的queue_rq函数,这个函数是每一个硬件派发队列对应驱动都必须提供的。我们之前所研究的virtio部分是挂在pci总线上面的,然而在多数情况下,硬盘是通过scsi子系统被发现并管理的,磁盘驱动为scsi子系统中的一种高级驱...

marlos的博客 967

Long Story of Block - segment

segment segment 的概念实际来自 DMA controller,DMA controller 可以实现一段内存物理地址区间与一段设备物理地址区间之间的数据拷贝,segment 就描述 DMA 数据传输过程中的一段连续的内存空间,也就是说 DMA controller 可以将内存中一个 segment 中的数据拷贝到设备,或将设备中的数据拷贝到 segment 中 segment 可以是一个 page,也可以是一个 page 的其中一部分,通常存储一个或多个相邻的 sector 的数据 .

yiyeguzhou100的专栏 725

IO虚拟化 - virtio-blk前端驱动分析

1. 概述 Kvm是一种全虚拟化架构的虚拟机,其IO通常由qemu进行模拟实现,相比半虚拟化方案xen,其IO效率相对较低,为了提高kvm的IO效率,在其中引入virtio模块。Virtio是一种linux的半虚拟化IO框架,对块设备、网络等进行了虚拟化。将virtio运用半虚拟化思想,分为前端驱动和后端驱动,前端驱动在客户机中,因此,需要在原来客户机操作系统中增加一个新的virtio前端驱动模块...

硅基创想家的博客 4290

VIRTIO-BLK代码分析(3)数据流处理

中,并最终由virtio_pci_notify_write()模拟操作,通过函数virtio_blk_handle_output()将数据下发,这里如果支持IO_URING时,可以通过luring_co_submit()提交IO请求;虚拟机中通过FIO等下发IO请求,IO请求通过VFS/filesystem,然后到BLOCK层,传递给virtio-blk驱动,virtio-blk驱动通过virtio_queue_rq()下发IO请求,并通过vp_notify()通知QEMU中VIRTIO设备数据准备完毕。

flyingnosky的专栏 1078

关于 virtio 的重要知识点总结

1,virtio ring(vring)队列由 guest 准备(申请内存),vring包含三部分:desc, avail, used, 且 vring.avail 所指向的 desc 也由 guest 准备,guest 给队列准备 desc 分两种: 1),发送时准备,如 virtio-blk 所用队列以及 virtio-net 中 guest 主动发送数据用到的队列; 2),事先准备好,如 virtio-net 中 host 主动发送数据的队列; 2,virtio-blk ...

yiyeguzhou100的专栏 3084

KVM主题:virtio-blk块设备I/O路径解析

virtio-blk是KVM虚拟化环境中用于模拟块设备的一种标准接口,它通过virtio框架实现虚拟机与宿主机之间的高效数据传输。virtio-blk抽象了物理块设备的细节,为虚拟机提供了一个统一的、虚拟化的块设备视图。这种设计使得虚拟机能够以接近原生性能的方式访问存储资源,同时保持了良好的可移植性和灵活性。virtio-blk块设备的I/O路径是一个复杂而高效的过程,它涉及虚拟机内部、virtio-blk驱动、QEMU模拟器以及宿主机存储后端等多个环节。

339

I/O 虚拟化技术 — VirtIO

目录 文章目录目录前文列表VirtIO为什么需要 VirtIO?VirtIO 的架构VirtIO 的网络实现virtio-net 驱动与设备vhost-net 处于内核态的后端vhost-user 使用 DPDK 加速的后端vDPA 使用硬件加速数据面 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》 《虚拟化技术实现 — QEMU-KVM》 《虚拟化技术实现 — KVM 的 CPU 虚拟化............

烟云的计算 5707

ArcGIS基础:CAD数据转换为GIS数据(符号化显示、数据转换、线转面、空间连接)

1、符号化显示: CAD数据加载进来有很多列表,包含了点【point】、线【polyline】、面【polygon】、标注数据【Annotation】等数据,本次实验我们需要用到的是面数据,也就是.dwgPolygong格式的数据。如下图所示: 把数据加载进来,然后在2处打开属性表,查看CAD数据的属性表,打开后可以发现【layer】图层表示就是地块的用地性质,它就是符号化显示的依据。 我们在数据上右键【属性】,打开图层属性,找到【符号系统】,选择类别中的【唯一值】,然后在【值字段】下拉选择【layer】,

yuanYW7556的博客 2万+

VirtIO实现原理——PCI基础

virtio设备可以基于不同总线来实现,本文主要介绍基于pci的实现,virtio-pci设备。 以virtio-blk为例,首先介绍virtio设备的配置空间内容,之后介绍为实现virtio-pci设备,在pci配置空间基础上增加的capability的内容,然后介绍virtio-blk规定的配置空间内容,最后介绍virtio设备的初始化和vring环初始化和使用。

Take Easy,Work Hard! 1万+

《生成式AI引发的“认知污染”:社交媒体虚假信息的治理困局》

认知污染与生成式AI“认知污染”指信息环境被大量虚假、误导性内容所充斥,干扰公众对事实的认知判断。在社交媒体时代,虚假信息的生产和传播门槛大幅降低,呈现出工业化、规模化的趋势。近年兴起的生成式人工智能(Generative AI)技术,如大型语言模型(LLM)和深度伪造(deepfake),更是加剧了这一问题。AI可以自动生成看似真实的文本、图像、音视频,将虚假信息批量生产并快速散播到社交平台上。

那谁的博客 5913

virtio 虚拟化系列之一:从 virtio 论文开始(文末有福利~)

作者/公司介绍@panic,SmartX 存储研发工程师。SmartX是中国领先的超融合产品与企业云解决方案提供商,拥有国内最顶尖的分布式存储和超融合架构研发团队,在分布...

Linux阅码场 6065

C++开发基础之掌握常用的三种异步编程模型

以上是三种常见的C++异步编程模型,每种模型都有其适用的场景和特点。根据具体需求,你可以选择合适的模型来进行异步编程。

dotnet研习社 2176

从虚拟机到双系统:手把手教你为Gromacs搭建最强Linux环境(含WSL2、Ubuntu22.04配置)

本文详细指导如何在Windows系统下为Gromacs分子动力学模拟搭建高性能Linux环境,涵盖WSL2和Ubuntu22.04双系统配置。通过对比虚拟机、WSL2和原生Linux的性能数据,提供GPU加速、内存优化等实用技巧,帮助科研人员提升计算效率。

weixin_30861797的博客 270

Rust Hypervisor Firmware的virtio-blk驱动全解析:从PCI设备枚举到磁盘数据读取的完整旅程

Rust Hypervisor Firmware(rust-hypervisor-firmware)是一个用 Rust 编写的轻量级虚拟机固件,它的核心能力之一就是内置了一套完整的 **virtio-blk 驱动**,能够直接从磁盘镜像中读取内核并引导启动。这篇文章将带你从零开始,沿着"PCI 设备发现 → virtio 传输层初始化 → virtqueue 队列通信 → 磁盘扇区读取"这条完整链

gitblog_00042的博客 467

【华为OD机试】贪吃蛇(python, java, c++, js)

贪吃蛇是一个经典游戏,蛇的身体由若干方格连接而成,身体随蛇头移动。蛇头触碰到食物时,蛇的长度会增加一格。蛇头和身体的任一方格或者游戏版图边界碰撞时,游戏结束。 下面让我们来完成贪吃蛇游戏的模拟。 给定一个NM的数组arr,代表NM个方格组成的版图,贪吃蛇每次移动一个方格。 若arr[i][j] == H,表示该方格为贪吃蛇的起始位置; 若arr[i][j] == F,表示该方格为食物, 若arr[i][j] == E,表示该方格为空格。 贪吃蛇初始长度为1,初始移动方向为向左。

A_D_I_D_A_S的博客 541

Virtio 半虚拟化技术解析

Virtio是一种标准化的半虚拟化框架,通过前端驱动与后端设备的高效协作提升I/O性能。其核心组件包括前端驱动、后端设备、传输层(如virtio-pci)和Virtqueue环形缓冲区。主要驱动包括:virtio-blk(虚拟磁盘,通过批处理和零拷贝优化I/O)、virtio-net(虚拟网络,支持多队列和vhost-net加速)以及virtio-balloon(动态内存管理)。相比全虚拟化,Virtio减少了上下文切换和VM-Exit次数,显著提高性能,成为云计算平台的关键技术。

漫谈网络 1104

(9-2)离线强化学习:离线强化学习的主流方法

本文介绍了三种离线强化学习的主流约束策略优化方法:BCQ、CQL和Fisher-BRC,并通过CartPole环境进行性能比较。BCQ利用生成模型约束动作选择并引入扰动网络;CQL通过正则化Q值抑制对未见状态-动作对的高估;Fisher-BRC使用Fisher散度正则化策略分布。实验结果表明,三种方法各有优势,其中CQL表现最为稳定。文章还指出,为获得更好的性能,需要更大的数据集和更长的训练轮次。这些方法通过限制策略优化范围,有效提高了离线强化学习的稳定性和泛化能力。

码农三叔 1539

GEE:使用 CCDC 算法进行连续变化检测和分类

连续变化检测和分类(CCDC)算法是一种广泛应用于遥感数据分析的方法,可以用于检测土地覆盖变化、农作物生长状态的变化以及水资源的变化等。Google Earth Engine是一个强大的云端平台,提供了丰富的遥感数据和工具,可以用于执行各种类型的遥感数据分析。本文将介绍如何使用Google Earth Engine的CCDC算法进行连续变化检测和分类。

养乐多的博客 5679

virtio简介

KVM是必须使用硬件虚拟化辅助技术(如Intel VT-x、AMD-V)的Hypervisor,在CPU运行效率方面有硬件支持,其效率是比较高的;在有Intel EPT特性支持的平台上,内存虚拟化的效率也较高;有Intel VT-d的支持,其I/O虚拟化的效率也很高。QEMU/KVM提供了全虚拟化环境,可以让客户机不经过任何修改就能运行在KVM环境中。不过,KVM在I/O虚拟化方面,传统的方式是使用QEMU纯软件的方式来模拟I/O设备(如第5章中提到模拟的网卡、磁盘、显卡等),其效率并不太高。

czw 1330

地平线J6的基础简介

地平线J6M芯片:面向中阶辅助驾驶市场的高性价比芯片

weixin_43084908的博客 4460

Qemu模拟IO和半虚拟化Virtio的区别以及I/O半虚拟化驱动介绍

QEMU的基本原理和优缺点 基本原理: 使用QEMU模拟I/O的情况下,当客户机中的设备驱动程序(device driver)发起I/O操作请求之时,KVM模块中的I/O操作捕获代码会拦截这次I/O请求,然后经过处理后将本次I/O请求的信息存放到I/O共享页,并通知用户控件的QEMU程序。QEMU模拟程序获得I/O操作的具体信息之后,交由硬件模拟代码来模拟出本次的I/O操作,完成之后,将结果放回...

weixin_34051201的博客 2129

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VirtIO 设备

VirtIO 是由 OASIS 标准化的(Para-Virtualization),区别于全硬件模拟(如 emulated e1000),它让客户机(Guest)主动感知虚拟化环境,通过标准前端驱动直接与宿主机(Host)后端通信,大幅减少冗余模拟开销,是 KVM/QEMU、Xen 等主流虚拟化方案的默认高性能 I/O 方案。virtio_netvirtio_blkvirtqueue性能核心,基于共享内存的环形缓冲结构,每个设备可拥有多个队列(如 virtio-net 通常分收 / 发两队列)

tangzhangyin的专栏 332

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

kvm virtio功能配置

1.virtio(virtual i/0)本文的原理性图片来源于书本<kvm虚拟化技术 实战与原理解析> virtio 是一个在hypervisor之上的api,它对客户机的i/o操作进行优化 使用virtio前,一次客户机的i/o请求过程如下: (1)客户机的通过设备驱动程序(device driver...

weixin_34349320的博客 818

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: virtio-blk初始化
下一篇: ucontext-人人都可以实现的简单协程库
LPSTC123
博客等级 码龄17年 17粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值