以virtio-blk为例,它标记了这个位,因此在virtio-blk设备配置空间之后,还有一段空间用来实现virtio-blk的一些特有功能。1表示capabilities pointer字段(0x34)存放了附加寄存器组的起始地址。这里的地址表示附加空间在pci设备空间内的偏移 virtio-blk配置空间的内容可以通过lspci命令查看到,如下 virtio配置空间 virtio-pci设备...
所以vhost-blk都是基于用户态的SPDK技术,访问本地磁盘或者远端分布式存储。这点和网络稍微有点差异,网络存在本地内核态的tap设备,存储没有。vhost-blk 的工作原理主要涉及以下几个方面: 共享Ring Buffer:虚拟机中的前端驱动与宿主中的 vhost-blk 模块共享一个 Ring Buffer,用于在两者之间传输数据、命令和执行结果。
DPDK代码中vhost-blk的测试程序可以通过meson配置编译时加上“-Dexpamples=vhost_blk”参数来生成,使用说明可以参考35. Vhost_blk Sample Application — Data Plane Development Kit 22.07.0-rc1 documentation。 参考链接 virtio blk原理 - 简书 virtio-blk简介_sdulibh的博客-CSDN博客 virtio-net原理(二) - 蓝色...
上面的结构体有个规律,逐渐由pci device往blk device转变,VirtIOPCIProxy,VirtIOBlock两个就是pci device和blk device的桥梁。
virtio-blk 是虚拟化 KVM 平台下虚拟磁盘的一种实现方式,本质上为一种半模拟技术。virtio-blk 设备中采用 io_event_fd 进行前端到后端通知,采用中断注入方式实现后端到前端的通知,并通过 IO 环(vring) 进行数据的共享。 基本原理 IO 总体流程可以分为以下几个步骤,如下图所示: ...
(blk_dev[major].request_fn)) panic("Trying to read nonexistent block-device"); // 创建 request,调用块设备驱动的 request_fn 函数,将 buffer_head 转换为 request make_request(major,rw,bh); } static void make_request(int major,int rw, struct buffer_head * bh) { struct request * req; ...
virtio 的驱动程序代码在 Linux 操作系统的源代码里面,文件名叫 drivers/block/virtio_blk.c。 static int __init init(void) { int error; virtblk_wq = alloc_workqueue("virtio-blk", 0, 0); major = register_blkdev(0, "virtblk"); error = register_virtio_driver(&virtio_blk); ...
capabilities list 位在配置空间之后形成附加空间,最大不超过 256 字节。例如,virtio-blk 设备标记了此位,配置空间后有额外实现 virtio-blk 功能的寄存器。使用 lspci 命令可查看 virtio 设备配置空间内容。为了实现特定功能,virtio-pci 设备在实现通用配置空间后,设计自定义配置空间。配置空间后有 ...
其中前端驱动(frondend,如virtio-blk、virtio-net等)是在客户机中存在的驱动程序模块,而后端处理程序(backend)是在QEMU中实现的。在这前后端驱动之间,还定义了两层来支持客户机与QEMU之间的通信。其中,“virtio”这一层是虚拟队列接口,它在概念上将前端驱动程序附加到后端处理程序。一个前端驱动程序可以使用0个或多...