自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(482)
  • 资源 (4)
  • 收藏
  • 关注

原创 不同虚拟化解决方案下的设备直通

在vDPA 设备直通解决方案下,由 qemu 模拟 virtio 设备的 pci 配置空间,对于不同型号的物理设备在VM 中看到的都是 virtio 设备,VM 中不使用真实设备的驱动(对于网卡使用 virtio-net 驱动),因此没有热迁移问题(核心思想:在VM中使用通用驱动程序将其与特定的宿主机上设备配置分离),vDPA 要求厂商支持将 virtio 数据面卸载到设备硬件上,这样 virtio数据面可直接从VM或容器内应用程序映射到物理设备中的VF(数据面直达 VF)。

2024-02-07 23:53:54 217

原创 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 220

转载 反向映射rmap

在内存回收时,除了将物理页还给伙伴系统,还需要解除物理页和虚拟页面的映射关系。从 物理地址找对应的虚拟地址,就是反向映射。匿名页、ksm页面和文件页面,它们的反向映射机制不一样。这一节简单了解下这三种反向映射。内核版本linux-5.15.60。

2024-01-14 22:09:40 210

转载 布隆过滤器(Bloom Filter)原理及实现

布隆过滤器(Bloom Filter)原理及Guava中的具体实现 - 简书

2024-01-06 21:54:08 203

转载 PCIe的ATS机制

而根据现今大量学术界和工业界的研究表明,决定查表性能的好坏的一个最为关键的点是TLB的预测。而ATS的机制恰好提供了一个TLB的预测卸载到源头去的机制,让用户(设备)自己根据自己自身的业务流来设计自己的预测策略,而且用户彼此之间的预测模型不会受到彼此的影响,从而大大提高了用户自己的预测的准确性。因此,对于malicious设备,或者是被入侵的设备,又或者是设备自身设计的bug,其会发出PA访问那些其没有权限访问或者是不属于其的物理地址空间,从而带来系统的isolation的破坏,系统安全的威胁等安全问题。

2023-11-27 10:56:35 621

原创 use_mm() 在 vhost 中的使用

在内核态要访问某用户进程地址空间,本质就是使用该用户进程地址空间的页表,可使用 use_mm 切到使用用户进程的 mm,

2023-11-07 23:22:01 368

原创 Userfaultfd

Userfaults allow the implementation of on-demand paging from userland and more generally they allow userland to take control of various memory page faults, something otherwise only the kernel code could do.For example userfaults allows a proper and more op

2023-10-27 21:51:45 371

转载 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 375

原创 vma ops fault, fixup userfault

调用具体 vma 的 ops.close 函数。

2023-08-10 23:19:51 506

转载 什么时候需要cpu_relax()锁

在典型的超线程处理器中,每个超线程不是一个独立的core,所以两个或者多个超线程之间仍然在竞争一些资源,如果其中一个人调用了yield,那么它会在争抢中放慢节奏,而旁边的那个兄弟会抢地更多。2, 如果是超线程CPU的机器,可以让渡CPU给其他的线程;当然,cpu_relax()的具体实现与体系架构相关,不同的体系架构实现不一样,可能只完成了上面3个功能中的1个,2个而不是全部。总之,不管具体的体系架构怎么实现,忙等里面都适合加cpu_relax(),毕竟内核多数的代码要求是跨平台的。

2023-07-21 17:42:57 869

转载 中断实时性及处理技术简介(指令退休)

在通常情况下,CPU会在每条指令的“退休”阶段响应中断。所谓“退休”,是指一条指令已经完成了所有的操作,即将从流水线上退出。如果CPU执行了多周期指令或者执行延时不可预期指令,那么该条指令需要较长的时间才能到达“退休”阶段。此时的中断响应速度会受到极大影响,大幅降低系统的实时性。在中断快速响应模式下,CPU无需等待指令退休,即可直接响应中断。这一机制可以打断较长执行延时的指令,从而提高中断响应的速度。

2023-07-09 23:00:23 639

原创 DMAR IOMMU页表错误

而实际上这个 iova 地址是一个无效的地址,即 dma 访问到了一个已经释放的 virtio desc table 中存储的地址,显然该地址的页表没有设置,设备在进行 DMA 操作的时候,检查页表失败,在 IOMMU 的错误处理函数中会打印详细信息。如下,出现 DMAR 错误,iova 0x9e4ef2373000 的 PTE 页表没有设置,

2023-07-01 15:28:01 1371

转载 x86 LOCK 指令前缀

在中的章节中给出LOCK指令的详细解释LOCK是一个指令前缀,也就是说LOCK会使紧跟在其后面的指令变成原子指令(atomic instruction)。LOCK指令前缀只能加在以下这些指令前面。

2023-06-16 23:54:13 1156

原创 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 1021

转载 x86 架构下 StoreLoad 屏障

从图例可以看到第六步assert失败的核心原因在于,cpu0上缓存过b,所以cpu0执行b = 1k立马写入cache,然后线程B所在的cpu1执行while(b==0)迅速跳出,然后执行 a = 1,由于此时 a 还在cpu0的store buffer中,所以导致assert失败。CPU1 执行assert( a == 1),发现a 不在cache中,向CPU0发送read消息,CPU0的cache中存在a,所以CPU1获取到a = 1,assert成功。1,为什么CPU要乱序执行,难道是考虑性能吗?

2023-05-07 19:29:49 853 1

原创 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 917

转载 vfio概述(vfio/iommu/device passthrough)

vfio

2023-03-04 23:42:45 4301

原创 PCI bar 解析

pci bar

2022-12-03 22:36:05 1640

转载 Process Address Space ID (PASID)

PASID

2022-11-27 20:19:22 1784

转载 VIRTIO PCI 设备

VIRTIO PCI 设备

2022-11-26 22:51:16 1491

转载 Architectural and OS support for Virtual Memory

Architectural and OS support for Virtual Memory

2022-10-29 22:03:13 566

原创 virtio-balloon 前后端源代码简单分析

virtio-balloon

2022-10-23 21:49:00 610

原创 sfence.vma

清除TLB缓存所有现代的处理器都用地 址转换缓存(通常称为 TLB,全称为 Translation Lookaside Buffer)来减少这种开销。为了 降低这个缓存本身的开销,大多数处理器不会让它时刻与页表保持一致。这意味着如果操 作系统修改了页表,那么这个缓存会变得陈旧而不可用。S 模式添加了另一条指令来解决 这个问题。这条sfence.vma 会通知处理器,软件可能已经修改了页表,于是处理器可以 相应地刷新转换缓存。它需要两个可选的参数,这样可以缩小缓存刷新的范围。一个位于 rs1,它指...

2022-05-02 23:15:57 3348

原创 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 1195

原创 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 1487

原创 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 1057

原创 The behavior inside pte_page()

以下展示了 pte_page() 的实现细节,x86 ptearch/x86/include/asm/pgtable-2level.h/* No inverted PFNs on 2 level page tables */static inline u64 protnone_mask(u64 val){ return 0;}arch/x86/include/asm/page_types.h, arch/x86/include/asm/pgtable_64_types.

2022-03-17 22:02:23 849

原创 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 1257

原创 关于 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 2544

原创 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 1977

原创 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 679

原创 为什么 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 3236

原创 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 2241

原创 ext4 barrier

将ext4的mount参数加上nobarrier,测试结果显示性能明显有提升,一旦mount参数不指定nobarrier,性能就成倍下降。代码中barrier在ext4中是默认开启的,其目的是为了保证文件系统元数据比真实数据先落盘,简单来说就是文件系统往磁盘写了元数据后,会让驱动给磁盘发一个flush命令,以保证此时停留在磁盘控制器缓存中的元数据落到盘上。...

2021-10-30 11:47:17 1046

转载 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 399

原创 Linux kernel fault injection

https://www.kernel.org/doc/Documentation/fault-injection/fault-injection.txthttps://www.kernel.org/doc/Documentation/fault-injection/nvme-fault-injection.txthttps://lwn.net/Articles/209257/example nvme?:https://git.kernel.org/pub/scm/linux/kernel/git/t

2021-07-17 12:17:22 306 2

原创 limit bio max size when convert page->bio

https://lkml.org/lkml/2021/4/12/2168https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?h=next-20210622&id=cd2c7545ae1beac3b6aae033c7f31193b3255946

2021-06-23 12:40:12 105

转载 Long Story of Block - segment

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

2021-06-22 09:49:45 361

转载 一次解决磁盘IO读取慢全过程

在两台型号相同的机器上(snap1 和snap3)测试磁盘的读取速度,发现两台机器的读取速度差的很大: #dd if=/dev/dm-93 of=/dev/null bs=4M count=1024 711MB/sonsnap1. 178MB/sonsnap3. 接下来比较snap1和snap3两台机器上关于dm-93磁盘(raid)的以下字段输出都是一样 /sys/block/<device>/queue/max_sectors_kb ...

2021-06-11 19:59:26 1371

原创 Linux网络 - 数据包的接收过程

https://segmentfault.com/a/1190000008836467

2021-05-25 23:42:59 93

lemoal-nvme-polling-vault-2017-final_0.pdf

https://events.static.linuxfound.org/sites/events/files/slides/lemoal-nvme-polling-vault-2017-final_0.pdf

2020-03-13

个人总结 - m25p80.c debug on Micron spi nor_flash.pdf

个人总结 - 对flash芯片MTD驱动文件m25p80.c进行debug,是基于Micron的MT25Q128 spi nor_flash chip(16M)

2017-09-04

ARM9启动机制分析

ARM9启动机制分析 ARM9启动机制分析 ARM9启动机制分析

2010-12-29

labview 典型应用

labview 典型应用labview 典型应用labview 典型应用labview 典型应用labview 典型应用labview 典型应用

2010-08-09

空空如也

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

TA关注的人

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