http://git.qemu.org/git/qemu.git v2.8.0 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git 4.4.70 1.VRing的初始化 QEMU下的VRing [crayon-5dd560d2e4adc629035207/] VirtQueue在QEMU端的初始化,即virtio_add_queue, virtio最多有1024个虚拟队列,且每个队列最多容纳1024个request单位...

QEMU下的内存结构体很多了,RAMBlock,MemoryRegion,AddressSpace,MemoryRegionSection,KVMSlot和kvm_userspace_memory_region,很多时候看代码时候都会被搅合成一坨,虽然很早时候在KVM源代码分析2:虚拟机的创建与运行和KVM源代码分析4:内存虚拟化都提到了内存虚拟化的过程,但实际上这几个结构体之间的关系并没有理...

源代码版本:git://git.qemu.org/qemu.git v2.5.0 savevm指令对应的函数是hmp_savevm,loadvm则是hmp_loadvm, 对应的函数是 [crayon-5dd560d2e62a3519967146/] 上面这个代码是编译生成的,在编译目录下面的x86_64-softmmu/hmp-commands.h。 先看hmp_savevm,在qemu monitor console下执行savevm oenhan指令,在...

在非虚拟化环境上,Linux的内存寻址就不多说了,不了解的参考Linux内存寻址,只提一下相关的权限检查,在分页机制上进行多级寻址,每次获取下一级地址都需要访问页表项的值进行计算,在读取之前,kernel会将页表项里面的权限值和当前访问线程的属性进行比较,如果不满足权限,则进行page_fault。基本页表项内容如下: ...

终于把KVM源代码分析3:CPU虚拟化写完了,虽然还有run的部分另外在写,还是先看一下内存虚拟化部分。 代码版本:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git v3.16.37 在虚拟机的创建与运行中pc_init_pci负责在qemu中初始化虚拟机,内存初始化也是在这里完成的,还是一步步从qemu说起,...

又一次开始土法炼钢了,测试部发现很多环境panic了,从黑匣子看到的信息是OOM了,虽然kill掉了占用比最大的进程,但是监控进程发现后reboot了单板。然后把meminfo收集到的信息,对比发现,slab增长的非常快,发现task_struct占用了很多,通过硬件中断和jprobe挂钩子发现是一个驱动访问所有进程的atomic_t usage,调用get...

13年的时候准备挖“KVM源代码分析”的坑,陆陆续续2年过去了,坑也没有填上,当时是因为对KVM了解的肤浅,真正的理解必然要深入到代码级别,所谓“摈弃皮毛,看到血肉,看到真相”,当时计划写KVM基本工作原理、虚拟机的创建、VCPU调度原理、KVM内存管理、KVM设备管理等,实际发现代码过程还是很多,估计后续会针对于不同的...

swap分区出现是因为硬件落后的时候,被OS设计人员搞出来承担一部分内存工作的,那时候的硬盘的速度和内存速度的差别对性能的影响还不明显,但随着现在高性能程序的要求,swap分区的读写速度严重影响了性能。 swappiness又被留出来作为控制swap使用程度的接口,关于/proc/sys/vm/swappiness的介绍wiki有 Swappine...

当超群发来的问题,一个低端内存耗尽导致系统panic的问题,通过写一个死循环循环调用同一个脚本,然后盯着/proc/slabinfo看,就会发现size-32类型的slab火速增加。通过简单直接有效古老的排除法(感谢每日持续集成编译),确定是内核的问题,老的内核没问题,新内核有问题,本来直接上大神器,kmemcheck,奈何看了一眼内...