自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(221)
  • 收藏
  • 关注

原创 BLOCK层代码分析(0)存储IO框架介绍

更新了BLOCK层代码分析(1)(2)后,觉得有必要对存储IO框架层次做介绍,因此增加了本小节。1.存储IO框架存储IO内核框架如下图所示:以上列出几种驱动的存储软件框架,包含NVME驱动/SAS驱动/SATA驱动。IO依次经过系统调用层、文件系统层、BLOCK层、SCSI层、LIBSAS/LIBATA层以及LLDD。但并不是所有的这些层都经过,比如对于NVME驱动,对接BLOCK层,并不会经过SCSI层等。并且上图只是简单的描述,每层...

2021-11-15 19:37:35 3410 3

原创 Linux内核代码分析集合(持续更新中)

这里将自己各专栏系列内容放一起,以方便快速找到对应内容,持续更新中。(4)VIRTIO/VHOST代码分析。(7)ARM64内存虚拟化分析。(5)GIC/ITS代码分析。(1)BLOCK层代码分析。(2)SCSI层代码分析。(3)VFIO代码分析。(6)SMMU代码分析。

2023-10-09 22:43:24 409

原创 VHOST-SCSI代码分析(5)VHOST CALL机制

两者都需要在初始化eventfd,通过KVM_SET_GSI_ROUTING和KVM_IRQFD将中断与irqfd关联起来。HOST内核完成数据的处理后,将通知虚拟机数据处理完成,这个过程是通过注入中断实现的。VHOST框架中是通过函数。

2023-09-17 20:25:50 273

原创 VHOST-SCSI代码分析(4)VHOST KICK机制

中使能ioeventfd,使MMIO地址与ioeventfd关联,这样虚拟机中对MMIO操作,最终在KVM中通过ioeventfd_write通过eventfd_signal通知VHOST设备(图中蓝色部分)。在VIRTIO框架中虚拟机通知QEMU数据准备好是通过操作MMIO,在KVM中将操作分发到QEMU中,由QEMU中模拟对应的MMIO操作(图中红色部分)。VHOST框架虚拟机通知HOST内核数据准备好也是通过MMIO操作,但在函数。

2023-09-17 20:22:48 257

原创 VHOST-SCSI代码分析(3)数据流处理

HOST内核通过vhost_scsi_handle_kick将SCSI命令下发,这里是将IO发给target core,target core会将IO请求经过SCSI层将IO发送给硬件。硬件处理后的IO完成信息经过SCSI层,target core,经vhost worker进行IO完成信息传递,HOST内核需要通知虚拟机IO完成信息准备,通过注入中断给虚拟机(VHOST CALL过程),虚拟机收到中断后,将IO完成信息依次经过SCSI层,BLOCK层,VFS/文件系统,最终完成IO。

2023-09-17 20:20:16 158

原创 VHOST-SCSI代码分析(2)VHOST SCSI驱动分析

在HOST内核中创建/dev/vhost-scsi,并提供用户态相关接口,在文件driver/vhost/scsi.c中。(4)VHOST WORKER相关的系统调用。(2)VHOST SCSI相关的系统调用。(3)VHOST DEV的相关系统调用。(1)VRING相关的系统调用。

2023-09-17 20:10:05 105

原创 VHOST-SCSI代码分析(1)VHOST SCSI设备模拟

VHOST SCSI设备的模拟是由QEMU和HOST共同实现的,QEMU模拟VHOST SCSI设备配置空间等,而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。在QEMU中VHOST SCSI设备继承关系如下:其它设备以及对应class_init函数和realize具现化实现与VIRTIO-SCSI一致,这里介绍TYPE_VHOST_SCSI部分。

2023-09-17 20:03:35 593

原创 VHOST-SCSI代码分析(0)VHOST概述

在虚拟机中,VHOST SCSI设备仍是PCIE设备,同时也是VIRTIO设备,这里对于虚拟机中呈现与VIRTIO-SCSI一样,因此驱动执行过程和VIRTIO-SCSI完全一样。在QEMU中,它也会模拟VHOST SCSI设备,但对于数据的传递机制,并没有设置,因此在数据传递时并不会切换到QEMU中。但对于配置空间等模拟,仍在QEMU中模拟。在HOST上,需要模拟VHOST SCSI设备的数据传递部分,包括ioeventfd用于虚拟机通知HOST数据准备好,irqfd用于Host通知虚拟机中断注入。

2023-09-17 19:51:43 168

原创 VIRTIO-SCSI代码分析(3)VIRTIO SCSI数据流处理

硬件完成IO处理后,IO完成信息依次通过SCSI层,BLOCK层,文件系统层,最终返回到QEMU中由函数virtio_scsi_command_complete()处理。虚拟机中vp_notify()访问寄存器,它会陷入到hypervisor中,并分发到QEMU中,并最终由virtio_pci_notify_write()模拟操作,通过函数virtio_scsi_handle_cmd()将数据下发,这里如果支持IO_URING时,可以通过luring_co_submit()提交IO请求;

2023-09-16 17:22:49 195

原创 VIRTIO-SCSI代码分析(2)VIRTIO 驱动分析

而在虚拟机中,PCIE设备与VIRTIO PCI驱动匹配触发virtio_pci_probe()注册生成virtio设备,而virtio设备与虚拟机中的virtio驱动匹配触发对应probe函数最终注册对应的驱动。VIRTIO PCI驱动与VIRTIO-BLK代码分析中一样(见“VIRTIO-BLK代码分析(2)VIRTIO驱动分析”中PCI驱动部分),这里不作重复分析。这里VIRTIO-BLK/VIRTIO-SCSI/VIRTIO-NET过程都类似,只是virtio驱动根据不同virtio设备作匹配。

2023-09-16 17:19:41 267

原创 VIRTIO-SCSI代码分析(1)VIRTIO SCSI设备模拟

其中前面为父设备,后面为子设备,相关函数执行顺序为:父设备class_init -> 子设备class_init -> 父设备 instance_init -> 子设备instance_init -> 设备realize具现化。它主要是设置virtqueue的回调函数,这里对于传输命令的vq的回调函数为virtio_scsi_handle_cmd,它负责将虚拟机中传递过来的SCSI命令通过blkio API往Host内核发送。

2023-09-16 17:11:07 254

原创 VIRTIO-BLK代码分析(5)virtqueue通信

其中vring结构体描述了Guest和Host之间传递数据的virtqueue结构体,num表示virtqueue最大数目,desc为vring_desc的基地址,vring_desc描述了虚拟机中一段GPA地址,avail指向可用的vring_desc索引,虚拟机VIRTIO驱动设置,used指向已完成处理的vring_desc,QEMU中设备设置。通过函数vring_create_virtqueue创建virtqueue,通过函数virtqueue_add_sgs添加数据。

2023-09-16 17:06:07 222

原创 VIRTIO-BLK代码分析(4)VIRTIO设备中断的注入

VIRTIO设备中断包括vq中断和config中断。Vq中断用于通知Guest已完成数据的处理,虚拟机中可以完成IO请求。Vq中断的模拟是通过irqfd实现的,它将虚拟机中断与irqfd关联上(KVM_SET_GSI_ROUTING和KVM_IRQFD),当虚拟机中访问特定内存时,在KVM中模拟注入中断。通过KVM_SET_GSI_ROUTING和KVM_IRQFD将中断关联到irqfd。当Host完成IO时通过vritio_notify访问特定的内存(MSIX中断),它最终在KVM中模拟中断注入。

2023-09-06 22:21:08 280

原创 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设备数据准备完毕。

2023-09-06 22:18:07 332

原创 VIRTIO-BLK代码分析(2)VIRTIO驱动分析

QEMU模拟的VIRTIO设备同时也是PCIE设备,Guest中VIRTIO PCIE驱动与之匹配,根据设备驱动模型,最终触发probe函数virtio_pci_probe()。该probe函数使能PCIE设备,并注册VIRTIO设备,并与VIRTIO-BLK匹配,触发VIRTIO-BLK驱动probe函数。这里涉及两个驱动:VIRTIO-PCI驱动和VIRTIO-BLK驱动。

2023-09-06 21:31:10 490

原创 VIRTIO-BLK代码分析(1)VIRTIO设备的模拟

VIRTIO设备的模拟

2023-09-05 22:07:04 310

原创 VIRTIO-BLK代码分析(0)概述

VIRTIO-BLK代码分析

2023-09-03 19:07:50 404

原创 这些年阅读过的专业书籍盘点

Linux内核相关

2022-12-30 17:16:20 1346 3

原创 ARM64内存虚拟化分析(8)coalesed MMIO处理

coalesced MMIO处理

2022-12-30 08:33:45 1340

原创 ARM64内存虚拟化分析(7)stage2异常处理

stage2异常处理

2022-12-30 08:24:54 1906 1

原创 ARM64内存虚拟化分析(6)向KVM注册内存更新

往KVM注册内存更新

2022-12-30 08:11:17 759

原创 ARM64内存虚拟化分析(5)内存布局更新

MR的添加和提交

2022-12-29 17:20:43 754

原创 ARM64内存虚拟化分析(4)MR的创建

MMIO MR和RAM MR的创建

2022-12-29 17:16:09 253

原创 ARM64内存虚拟化分析(3)MR API介绍

QEMU中MR API介绍

2022-12-29 17:10:45 336

原创 ARM64内存虚拟化分析(2)常用结构体

内存虚拟化相关结构体

2022-12-29 17:06:40 891

原创 ARM64内存虚拟化分析(1)基础知识

arm64内存虚拟化相关的基础知识

2022-12-29 16:59:25 1623

原创 ARM64内存虚拟化分析(0)概述

arm64内存虚拟化

2022-12-29 16:44:32 864

原创 GIC/ITS代码分析(13)LPI中断虚拟化之KVM中ITS设备的模拟

KVM中对ITS的模拟

2022-12-01 00:01:56 623

原创 GIC/ITS代码分析(12)LPI中断虚拟化之QEMU中ITS设备的模拟

QEMU中ITS设备的模拟

2022-11-30 23:52:43 645

原创 GIC/ITS代码分析(11)LPI中断虚拟化之概述

LPI中断虚拟化

2022-11-30 23:43:34 1002

原创 GICv3和GICv4虚拟化

GICv3 and GICv4 virtualization

2022-11-15 22:54:22 2235

原创 GIC/ITS代码分析(10)中断应用实例之SPI中断

SPI中断应用实例

2022-11-07 23:11:21 1998

原创 GIC/ITS代码分析(9)中断应用实例之PPI中断

PPI中断应用实例

2022-11-03 23:11:40 1096 1

原创 GIC/ITS代码分析(8)中断应用实例之SGI中断

SGI中断应用实例

2022-11-01 23:45:10 1309

原创 GIC/ITS代码分析(7)中断应用实例之LPI中断

LPI中断

2022-10-31 22:36:13 1434

原创 GIC/ITS代码分析(6)中断处理

中断处理

2022-10-29 07:00:00 1226

原创 GIC/ITS代码分析(5)exception处理流程

异常处理

2022-10-28 22:20:12 802

原创 GIC/ITS代码分析(4)中断的分配/映射及注册

中断分配,映射,注册

2022-10-27 23:12:26 1166

原创 GIC/ITS代码分析(3)ITS驱动初始化

ITS驱动介绍

2022-10-25 23:08:01 1435

原创 GIC/ITS代码分析(2)GICv3驱动初始化

GICv3驱动初始化

2022-10-25 00:15:40 1124

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除