- 博客(490)
- 资源 (4)
- 收藏
- 关注
转载 阿里大规模业务混部下的全链路资源隔离技术演进
内核资源隔离技术主要涉及内核中的调度、内存和 IO 这三大子系统,这些技术基于 Linux Cgroup V1 提供资源的基本隔离划分以及 QoS 保障,适用于容器云场景,同时也是大规模化混合部署方案所强依赖的关键技术。
2025-01-09 22:05:58
789
原创 什么是 Memory-bound stalls,以及如何优化
是指在计算机系统中,程序的性能受到内存访问速度的限制,导致处理器无法高效执行指令。这种情况通常发生在 CPU 需要等待数据从内存中加载时,而不是在执行计算或处理指令时。
2024-12-20 16:51:43
1203
转载 Linux kernel preempt_notifier
preempt_notifier本质上是一种,监听的事件是线程被调度(sched out)出去(例如时间片用完了或者被强占)、线程被重新调度(sched in)。本文参考内核版本为。
2024-09-30 09:37:57
1197
转载 Notes about iommu=pt kernel parameter
配置了iommu=pt如果Hardware supports pass-through translation type,则配置pass-through translation type即可实现identity mapping,此时无需配置iommu页表;如果Hardware doesn’t support pass-through translation type,则需要配置iommu页表,使得iova与hpa 1:1映射。当=0时,依然要走iommu页表,因此性能是不如=1的。
2024-09-24 23:15:35
1639
原创 workingset protection/detection on the anonymous LRU list
Working-set protection for anonymous pages [LWN.net][PATCH v3 0/9] workingset protection/detection on the anonymous LRU list [LWN.net]14.7 跟踪LRU活动情况和Refault Distance算法-优快云博客
2024-07-16 22:55:22
1376
原创 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
1628
2
原创 不同虚拟化解决方案下的设备直通
在vDPA 设备直通解决方案下,由 qemu 模拟 virtio 设备的 pci 配置空间,对于不同型号的物理设备在VM 中看到的都是 virtio 设备,VM 中不使用真实设备的驱动(对于网卡使用 virtio-net 驱动),因此没有热迁移问题(核心思想:在VM中使用通用驱动程序将其与特定的宿主机上设备配置分离),vDPA 要求厂商支持将 virtio 数据面卸载到设备硬件上,这样 virtio数据面可直接从VM或容器内应用程序映射到物理设备中的VF(数据面直达 VF)。
2024-02-07 23:53:54
1916
原创 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
1508
转载 反向映射rmap
在内存回收时,除了将物理页还给伙伴系统,还需要解除物理页和虚拟页面的映射关系。从 物理地址找对应的虚拟地址,就是反向映射。匿名页、ksm页面和文件页面,它们的反向映射机制不一样。这一节简单了解下这三种反向映射。内核版本linux-5.15.60。
2024-01-14 22:09:40
1521
转载 PCIe的ATS机制
而根据现今大量学术界和工业界的研究表明,决定查表性能的好坏的一个最为关键的点是TLB的预测。而ATS的机制恰好提供了一个TLB的预测卸载到源头去的机制,让用户(设备)自己根据自己自身的业务流来设计自己的预测策略,而且用户彼此之间的预测模型不会受到彼此的影响,从而大大提高了用户自己的预测的准确性。因此,对于malicious设备,或者是被入侵的设备,又或者是设备自身设计的bug,其会发出PA访问那些其没有权限访问或者是不属于其的物理地址空间,从而带来系统的isolation的破坏,系统安全的威胁等安全问题。
2023-11-27 10:56:35
2987
原创 use_mm() 在 vhost 中的使用
在内核态要访问某用户进程地址空间,本质就是使用该用户进程地址空间的页表,可使用 use_mm 切到使用用户进程的 mm,
2023-11-07 23:22:01
1681
原创 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
1693
转载 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
1681
转载 什么时候需要cpu_relax()锁
在典型的超线程处理器中,每个超线程不是一个独立的core,所以两个或者多个超线程之间仍然在竞争一些资源,如果其中一个人调用了yield,那么它会在争抢中放慢节奏,而旁边的那个兄弟会抢地更多。2, 如果是超线程CPU的机器,可以让渡CPU给其他的线程;当然,cpu_relax()的具体实现与体系架构相关,不同的体系架构实现不一样,可能只完成了上面3个功能中的1个,2个而不是全部。总之,不管具体的体系架构怎么实现,忙等里面都适合加cpu_relax(),毕竟内核多数的代码要求是跨平台的。
2023-07-21 17:42:57
2321
转载 中断实时性及处理技术简介(指令退休)
在通常情况下,CPU会在每条指令的“退休”阶段响应中断。所谓“退休”,是指一条指令已经完成了所有的操作,即将从流水线上退出。如果CPU执行了多周期指令或者执行延时不可预期指令,那么该条指令需要较长的时间才能到达“退休”阶段。此时的中断响应速度会受到极大影响,大幅降低系统的实时性。在中断快速响应模式下,CPU无需等待指令退休,即可直接响应中断。这一机制可以打断较长执行延时的指令,从而提高中断响应的速度。
2023-07-09 23:00:23
2174
原创 DMAR IOMMU页表错误
而实际上这个 iova 地址是一个无效的地址,即 dma 访问到了一个已经释放的 virtio desc table 中存储的地址,显然该地址的页表没有设置,设备在进行 DMA 操作的时候,检查页表失败,在 IOMMU 的错误处理函数中会打印详细信息。如下,出现 DMAR 错误,iova 0x9e4ef2373000 的 PTE 页表没有设置,
2023-07-01 15:28:01
3082
转载 x86 LOCK 指令前缀
在中的章节中给出LOCK指令的详细解释LOCK是一个指令前缀,也就是说LOCK会使紧跟在其后面的指令变成原子指令(atomic instruction)。LOCK指令前缀只能加在以下这些指令前面。
2023-06-16 23:54:13
2794
原创 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
1494
转载 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
1592
原创 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
1515
转载 Architectural and OS support for Virtual Memory
Architectural and OS support for Virtual Memory
2022-10-29 22:03:13
657
原创 sfence.vma
清除TLB缓存所有现代的处理器都用地 址转换缓存(通常称为 TLB,全称为 Translation Lookaside Buffer)来减少这种开销。为了 降低这个缓存本身的开销,大多数处理器不会让它时刻与页表保持一致。这意味着如果操 作系统修改了页表,那么这个缓存会变得陈旧而不可用。S 模式添加了另一条指令来解决 这个问题。这条sfence.vma 会通知处理器,软件可能已经修改了页表,于是处理器可以 相应地刷新转换缓存。它需要两个可选的参数,这样可以缩小缓存刷新的范围。一个位于 rs1,它指...
2022-05-02 23:15:57
4592
1
原创 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
1301
原创 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
1650
原创 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
1153
原创 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
933
原创 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
1527
原创 关于 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
2865
原创 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
2194
原创 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
738
原创 为什么 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
3518
lemoal-nvme-polling-vault-2017-final_0.pdf
2020-03-13
个人总结 - m25p80.c debug on Micron spi nor_flash.pdf
2017-09-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人