<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[flyingnosky的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/flyingnosky</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; flyingnosky]]></copyright><item><title><![CDATA[Linux内核代码分析集合（持续更新中）]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/133719275</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/133719275</guid><author>flyingnosky</author><pubDate>Mon, 09 Oct 2023 22:43:24 +0800</pubDate><description><![CDATA[这里将自己各专栏系列内容放一起，以方便快速找到对应内容，持续更新中。（4）VIRTIO/VHOST代码分析。（7）ARM64内存虚拟化分析。（5）GIC/ITS代码分析。（1）BLOCK层代码分析。（2）SCSI层代码分析。（3）VFIO代码分析。（6）SMMU代码分析。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（5）VHOST CALL机制]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132952259</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132952259</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 20:25:50 +0800</pubDate><description><![CDATA[两者都需要在初始化eventfd，通过KVM_SET_GSI_ROUTING和KVM_IRQFD将中断与irqfd关联起来。HOST内核完成数据的处理后，将通知虚拟机数据处理完成，这个过程是通过注入中断实现的。VHOST框架中是通过函数。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（4）VHOST KICK机制]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132952179</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132952179</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 20:22:48 +0800</pubDate><description><![CDATA[中使能ioeventfd，使MMIO地址与ioeventfd关联，这样虚拟机中对MMIO操作，最终在KVM中通过ioeventfd_write通过eventfd_signal通知VHOST设备（图中蓝色部分）。在VIRTIO框架中虚拟机通知QEMU数据准备好是通过操作MMIO，在KVM中将操作分发到QEMU中，由QEMU中模拟对应的MMIO操作（图中红色部分）。VHOST框架虚拟机通知HOST内核数据准备好也是通过MMIO操作，但在函数。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（3）数据流处理]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132951783</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132951783</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 20:20:16 +0800</pubDate><description><![CDATA[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。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（2）VHOST SCSI驱动分析]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132951531</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132951531</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 20:10:05 +0800</pubDate><description><![CDATA[在HOST内核中创建/dev/vhost-scsi，并提供用户态相关接口，在文件driver/vhost/scsi.c中。（4）VHOST WORKER相关的系统调用。（2）VHOST SCSI相关的系统调用。（3）VHOST DEV的相关系统调用。（1）VRING相关的系统调用。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（1）VHOST SCSI设备模拟]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132951101</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132951101</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 20:03:35 +0800</pubDate><description><![CDATA[VHOST SCSI设备的模拟是由QEMU和HOST共同实现的，QEMU模拟VHOST SCSI设备配置空间等，而对于虚拟机通知HOST和HOST通知虚拟机机制由HOST内核实现。在QEMU中VHOST SCSI设备继承关系如下：其它设备以及对应class_init函数和realize具现化实现与VIRTIO-SCSI一致，这里介绍TYPE_VHOST_SCSI部分。]]></description><category></category></item><item><title><![CDATA[VHOST-SCSI代码分析（0）VHOST概述]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132950985</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132950985</guid><author>flyingnosky</author><pubDate>Sun, 17 Sep 2023 19:51:43 +0800</pubDate><description><![CDATA[在虚拟机中，VHOST SCSI设备仍是PCIE设备，同时也是VIRTIO设备，这里对于虚拟机中呈现与VIRTIO-SCSI一样，因此驱动执行过程和VIRTIO-SCSI完全一样。在QEMU中，它也会模拟VHOST SCSI设备，但对于数据的传递机制，并没有设置，因此在数据传递时并不会切换到QEMU中。但对于配置空间等模拟，仍在QEMU中模拟。在HOST上，需要模拟VHOST SCSI设备的数据传递部分，包括ioeventfd用于虚拟机通知HOST数据准备好，irqfd用于Host通知虚拟机中断注入。]]></description><category></category></item><item><title><![CDATA[VIRTIO-SCSI代码分析（3）VIRTIO SCSI数据流处理]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132921302</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132921302</guid><author>flyingnosky</author><pubDate>Sat, 16 Sep 2023 17:22:49 +0800</pubDate><description><![CDATA[硬件完成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请求；]]></description><category></category></item><item><title><![CDATA[VIRTIO-SCSI代码分析（2）VIRTIO 驱动分析]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132921188</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132921188</guid><author>flyingnosky</author><pubDate>Sat, 16 Sep 2023 17:19:41 +0800</pubDate><description><![CDATA[而在虚拟机中，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设备作匹配。]]></description><category></category></item><item><title><![CDATA[VIRTIO-SCSI代码分析（1）VIRTIO SCSI设备模拟]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132921096</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132921096</guid><author>flyingnosky</author><pubDate>Sat, 16 Sep 2023 17:11:07 +0800</pubDate><description><![CDATA[其中前面为父设备，后面为子设备，相关函数执行顺序为：父设备class_init -> 子设备class_init -> 父设备 instance_init -> 子设备instance_init -> 设备realize具现化。它主要是设置virtqueue的回调函数，这里对于传输命令的vq的回调函数为virtio_scsi_handle_cmd，它负责将虚拟机中传递过来的SCSI命令通过blkio API往Host内核发送。]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（5）virtqueue通信]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132920997</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132920997</guid><author>flyingnosky</author><pubDate>Sat, 16 Sep 2023 17:06:07 +0800</pubDate><description><![CDATA[其中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添加数据。]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（4）VIRTIO设备中断的注入]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132724809</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132724809</guid><author>flyingnosky</author><pubDate>Wed, 06 Sep 2023 22:21:08 +0800</pubDate><description><![CDATA[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中模拟中断注入。]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（3）数据流处理]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132724114</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132724114</guid><author>flyingnosky</author><pubDate>Wed, 06 Sep 2023 22:18:07 +0800</pubDate><description><![CDATA[中，并最终由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设备数据准备完毕。]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（2）VIRTIO驱动分析]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132723811</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132723811</guid><author>flyingnosky</author><pubDate>Wed, 06 Sep 2023 21:31:10 +0800</pubDate><description><![CDATA[QEMU模拟的VIRTIO设备同时也是PCIE设备，Guest中VIRTIO PCIE驱动与之匹配，根据设备驱动模型，最终触发probe函数virtio_pci_probe()。该probe函数使能PCIE设备，并注册VIRTIO设备，并与VIRTIO-BLK匹配，触发VIRTIO-BLK驱动probe函数。这里涉及两个驱动：VIRTIO-PCI驱动和VIRTIO-BLK驱动。]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（1）VIRTIO设备的模拟]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132701401</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132701401</guid><author>flyingnosky</author><pubDate>Tue, 05 Sep 2023 22:07:04 +0800</pubDate><description><![CDATA[VIRTIO设备的模拟]]></description><category></category></item><item><title><![CDATA[VIRTIO-BLK代码分析（0）概述]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/132653864</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/132653864</guid><author>flyingnosky</author><pubDate>Sun, 03 Sep 2023 19:07:50 +0800</pubDate><description><![CDATA[VIRTIO-BLK代码分析]]></description><category></category></item><item><title><![CDATA[这些年阅读过的专业书籍盘点]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/128498327</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/128498327</guid><author>flyingnosky</author><pubDate>Fri, 30 Dec 2022 17:16:20 +0800</pubDate><description><![CDATA[Linux内核相关]]></description><category></category></item><item><title><![CDATA[ARM64内存虚拟化分析（8）coalesed MMIO处理]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/128490248</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/128490248</guid><author>flyingnosky</author><pubDate>Fri, 30 Dec 2022 08:33:45 +0800</pubDate><description><![CDATA[coalesced MMIO处理]]></description><category></category></item><item><title><![CDATA[ARM64内存虚拟化分析（7）stage2异常处理]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/128490224</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/128490224</guid><author>flyingnosky</author><pubDate>Fri, 30 Dec 2022 08:24:54 +0800</pubDate><description><![CDATA[stage2异常处理]]></description><category></category></item><item><title><![CDATA[ARM64内存虚拟化分析（6）向KVM注册内存更新]]></title><link>https://blog.youkuaiyun.com/flyingnosky/article/details/128490215</link><guid>https://blog.youkuaiyun.com/flyingnosky/article/details/128490215</guid><author>flyingnosky</author><pubDate>Fri, 30 Dec 2022 08:11:17 +0800</pubDate><description><![CDATA[往KVM注册内存更新]]></description><category></category></item></channel></rss>