yiyeguzhou100
专注,探索,分享
展开
-
在内核态使用 intel avx 加速内存操作
判断 page 是否为零页。原创 2024-08-31 22:07:16 · 175 阅读 · 0 评论 -
intel intrinsics
simd 指令封装函数。原创 2024-08-26 23:07:56 · 86 阅读 · 0 评论 -
x86 HT 与 pause 指令
Spinlock在不同的操作系统中的实现方式是不同的,不过大体原理是类似的,那就是自旋。以X86 CPU为例,一般来说某次获取轻量级锁的尝试失败后,LINUX会采用PAUSE命令等待10-数百个时钟周期再去重试,而在UNIX系统中,一个CPU时间片的长度为10毫秒,在这10毫秒中已经完全可以完成多个PAUSE等待了。主频为3.0Ghz的CPU,一个时钟周期大约是0.3纳秒,内存访问大约需要120纳秒,固态硬盘访问大约是50~150微秒,机械硬盘访问大约是1~10毫秒,网络访问最慢,大约需要几十个毫秒。原创 2024-05-02 23:13:11 · 348 阅读 · 2 评论 -
不同虚拟化解决方案下的设备直通
在vDPA 设备直通解决方案下,由 qemu 模拟 virtio 设备的 pci 配置空间,对于不同型号的物理设备在VM 中看到的都是 virtio 设备,VM 中不使用真实设备的驱动(对于网卡使用 virtio-net 驱动),因此没有热迁移问题(核心思想:在VM中使用通用驱动程序将其与特定的宿主机上设备配置分离),vDPA 要求厂商支持将 virtio 数据面卸载到设备硬件上,这样 virtio数据面可直接从VM或容器内应用程序映射到物理设备中的VF(数据面直达 VF)。原创 2024-02-07 23:53:54 · 543 阅读 · 0 评论 -
x86 clear accessed bit 后不 flush tlb
关于页表项的 accessed bit,OS 页表管理可以定期将其复位,但 TLB 一般不参与该 bit 位的管理,因为 TLB 中的页表项均为最近要访问的。例如,在 cpu load/store 内存时,如果对应的页表项不在 TLB 中,cpu 会 walk page table 并将页表项的 accessed bit 置位(如果之前已经被清除了),然后将该页表项更新到 TLB 中(这样 TLB 记录的页表项的 accessed bit 也是置位的)。原创 2024-01-22 23:24:29 · 376 阅读 · 0 评论 -
use_mm() 在 vhost 中的使用
在内核态要访问某用户进程地址空间,本质就是使用该用户进程地址空间的页表,可使用 use_mm 切到使用用户进程的 mm,原创 2023-11-07 23:22:01 · 538 阅读 · 0 评论 -
Sub-Page Write Protection of EPT
Enable Sub-Page Write Protection Support [LWN.net][PATCH RFC 00/10] Intel EPT-Based Sub-page Write Protection Support. — Linux KernelEPT-Based Sub-page Write Protection referred to as SPP, it is a capability which allow Virtual Machine Monitors(VMM) to sp转载 2023-09-29 13:26:40 · 535 阅读 · 0 评论 -
vma ops fault, fixup userfault
调用具体 vma 的 ops.close 函数。原创 2023-08-10 23:19:51 · 661 阅读 · 0 评论 -
DMAR IOMMU页表错误
而实际上这个 iova 地址是一个无效的地址,即 dma 访问到了一个已经释放的 virtio desc table 中存储的地址,显然该地址的页表没有设置,设备在进行 DMA 操作的时候,检查页表失败,在 IOMMU 的错误处理函数中会打印详细信息。如下,出现 DMAR 错误,iova 0x9e4ef2373000 的 PTE 页表没有设置,原创 2023-07-01 15:28:01 · 1707 阅读 · 0 评论 -
vt-d posted interrupt
posted 模式整个过程是由硬件做的,设备中断如果是 msi, 那先到IOMMU, IOMMU 根据 msi 信息为索引,查找中断重映射表,然后根据 posted descriptor 基址修改 posted descriptor 中的中断位,当 IOMMU 修改 posted descreptor 后,会给相应 vCPU 所在的物理 CPU 发送一个中断。同时创建VM时, posted descriptor 基地址会呈现在VMCS中。原创 2023-06-10 12:13:17 · 1189 阅读 · 0 评论 -
PCIE MSI-X Capability
PCIE的MSI-X相关信息存在两个地方,一个是PCIE Capability中,存放MSI-X基本信息,主要包含MSI-X Table所在BAR地址相关信息(访问的MSI-X Table关键),另外一个是MSI-X Table,存放在bar空间中,标识中断的msg addr及对应的msg data(即中断vector)。pci_find_capability() 断定一个设备是否支持给定PCI权能,返回在设备PCI配置空间内所请求权能结构的地址,如果设备不支持这种权能,则返回0;原创 2023-04-07 23:18:08 · 1267 阅读 · 0 评论 -
vfio概述(vfio/iommu/device passthrough)
vfio转载 2023-03-04 23:42:45 · 6362 阅读 · 0 评论 -
Process Address Space ID (PASID)
PASID转载 2022-11-27 20:19:22 · 2501 阅读 · 0 评论 -
VIRTIO PCI 设备
VIRTIO PCI 设备转载 2022-11-26 22:51:16 · 1644 阅读 · 0 评论 -
virtio-balloon 前后端源代码简单分析
virtio-balloon原创 2022-10-23 21:49:00 · 731 阅读 · 0 评论 -
KVM Interrupt Virtualization
KVM为每个虚拟机维护一个pic主中断控制器、一个pic从中断控制器以及一个ioapic控制器(使用pic 加 ioapic 的两种芯片的模拟组合,来控制中断信息),ioapic根据自身维护的重定向表pci irq routing table格式化出一条中断消息,把中断消息发送给local apic(lapic),每个vcpu维护一个lapic控制器,每个vcpu的lapic控制器则模拟了主要的apic寄存器:中断请求寄存器IRR,中断屏蔽寄存器IMR,中断服务寄存器ISR,EOI。同时每个虚拟机有一张中断原创 2022-04-09 16:27:26 · 1245 阅读 · 0 评论 -
KVM EPT页表
KVM在vcpu创建时创建和初始化MMU,kvm_vm_ioctl kvm_vm_ioctl_create_vcpu kvm_arch_vcpu_create kvm_mmu_create(vcpu) vcpu->arch.mmu = &vcpu->arch.root_mmu; vcpu->arch.walk_mmu = &vcpu->arch.root_mmu; __kvm_mmu_cr原创 2022-03-31 22:03:46 · 1559 阅读 · 0 评论 -
MMIO, RAM PageTable of Guest
在 Guest系统中IO访问可能分三种:1,guest 内部执行PMIO指令,guest 会触发VM_EXIT,退出状态是KVM_EXIT_IO;2,guest内部执行对MMIO空间的访问,guest 会触发VM_EXIT,退出状态将是KVM_EXIT_MMIO;3,guest 内部对ram物理内存的访问,会通过EPT硬件(x86)转化为HPA,进而完成对物理内存的读写(但如果是第一次访问由于EPT页表不存在,会发生EPT_VIOLATION,触发VM_EXIT进而建立EPT表项);MMIO原创 2022-03-20 20:57:17 · 1096 阅读 · 0 评论 -
VHOST KICK&CALL 原理
0. vhost vring设置VHOST_SET_VRING_KICK:建立virtio前端到vhost后端的通知机制;VHOST_SET_VRING_CALL:建立vhost后端到virtio前端的通知机制;1. VHOST_SET_VRING_KICK 原理vhost后端驱动使用,如vsock注册的收发包kick函数,vsock->vqs[VSOCK_VQ_TX].handle_kick = vhost_vsock_handle_tx_...原创 2022-02-15 22:49:06 · 1405 阅读 · 0 评论 -
关于 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 ...原创 2022-02-10 23:09:33 · 2724 阅读 · 0 评论 -
KVMTOOL: PCI设备的模拟
在 KVMTOOL 中对于PCI 设备的模拟,每个 virtio 后端驱动都会有如下类似这样的调用来初始化后端,例如virtio-vsock:virtio_vsock_init_one ->virtio_init -> virtio_pci__init(vdev->ops->init)。virtio_pci__init 函数就是在模拟一个PCI 设备的配置空间。int virtio_pci__init(struct kvm *kvm, void *dev, struct ...原创 2022-02-03 23:37:13 · 2087 阅读 · 0 评论 -
multi-page bvec 以及 vhost-blk 后端的处理
1,内核对mutil-page bvec 的 map如果是在虚拟机 guest 中,其可以通过半虚拟化前端驱动 virtio-blk 发送 IO 请求,将上层下发的IO 请求 request->bio 的bvec(可能是multi-page的bvec)先通过如下map函数转化为sglist,然后将sglist转化为 virtio-ring的表示形式:desc.addr, desc.len。如果是multi-page的bvec,那么desc.len > PAGE_SIZE.static.原创 2022-01-28 15:08:08 · 703 阅读 · 0 评论 -
为什么 guest 只能用虚拟串口设备 hvc1?
通常在虚拟 guest 中可用的第一个虚拟串口设备 hvc 应该是hvc0,为什么我们在 RISCV 平台上测试中发现第一个 guest 能用的 hvc 设备是 hvc1 而不是 hvc0 呢? 当guest 系统设置 bootargs = "console=hvc1,115200“ ,才有虚拟串口可用。通过debug虚拟串口分配函数 hvc_alloc,我们发现hvc0已经被opensbi给申请了,struct hvc_struct *hvc_alloc(uint32_t vtermno, in原创 2022-01-25 22:51:04 · 3364 阅读 · 0 评论 -
VIRTIO 前后端驱动中 GPA,HVA 转换原理
vhost收到 VHOST_SET_MEM_TABLE 后,设置guest内存空间布局,用于映射 guest 物理内存与 host 虚拟内存。KVMTOOL SETUPstruct vhost_memory *mem;list_for_each_entry(bank, &kvm->mem_banks, list) { mem->regions[i] = (struct vhost_memory_region) {原创 2022-01-22 11:53:45 · 2371 阅读 · 0 评论 -
QEMU-KVM BLOCK CACHE MODE
Performance TweaksJump to navigationJump to searchContents1Introduction 2General 2.1VirtIO 2.2Disk Cache 2.2.1Small Overview 3OS Specific 3.1Windows 3.1.1USB Tablet Device 3.1.2Use raw disk image and not qcow2 3.1.3Trace Flag T80转载 2021-10-14 14:55:05 · 454 阅读 · 0 评论 -
VirtIO实现原理——数据传输演示
初始化示意图 假设Host配置的virtqueue队列深度是10,初始化时Descriptor Table有10个条目,用于存放10个buffer指针,如下图所示,Descriptor Table的每一个条目初始化时都指向数组的下一个元素,所有10个entry组成一个descriptorchain。virtqueue的关键成员初始值如下: 1. num_free:10,表示有10个空闲buffer 2. free_head:0,表示当前Descriptor Table中,空闲buffer的头是转载 2021-01-31 12:55:06 · 1343 阅读 · 1 评论 -
vhost前后端通知机制场景分析
vhost前后端通知机制场景分析——lvyilong316http://blog.chinaunix.net/uid-31410005-id-5824531.html这篇文章主要详细的分析一下vhost的通知机制,前面的一些文章陆续也对前后端的通知有所介绍,这里相当于算是一次汇总吧。所谓前后端通知,必然涉及两个方向:前端通知后端,后端通知前端。而我们知道vhost有txq和rxq,对于每种queue都伴随有这两种通知。而通知方式又根据是否支持event_idx有着不同的实现,最后virtio转载 2021-01-24 22:38:14 · 1119 阅读 · 0 评论 -
Analysis of QEMU & KVM
Documentation/ArchitectureJump to navigationJump to searchThis page is analysis of QEMU & KVM.Contents1Architecture 1.1VM Enter 1.2VM Exit 2ReferencesArchitectureVM EnterVM ExitReferencesChoonho's Blog about...转载 2020-07-12 17:57:17 · 199 阅读 · 0 评论 -
openstack-KVM-vCPU
一、KVM基础功能 (1)支持 硬件支持 VT-x VT-d 系统支持 kernel > 3.5 (2)计算机系统的子系统 CPU 处理器 Memory 内存 Storage 存储 Network 网络 Display 显示二、 CPU SMP(Symmetrical Multi-Processing),对称多处理技术,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系统以及总线结构。转载 2020-07-12 10:19:18 · 863 阅读 · 0 评论 -
QEMU-KVM和Ceph RBD
https://www.cnblogs.com/sammyliu/p/5066895.html 理解 QEMU/KVM 和 Ceph(2):QEMU 的 RBD 块驱动(block driver)https://www.cnblogs.com/sammyliu/p/5095976.html 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结https://blog.csdn.net/weixin_42551719/article/detail...原创 2020-06-11 17:22:15 · 604 阅读 · 0 评论