QEMU/KVM下VCPU同步引发的死锁

问题不是出在upstream的版本上,而是内部开发的一个产品。在KVM这个系统里面,很多时候牵一发动全身,某些改动貌似是正确的,其实则不然,内核的其他模块也是类似的系统化,Jike说的“正是内核的开发门槛很高才保证了内核当前的质量”也是有道理的。 进入正题,产品要求VCPU进入guest之前需要等待响应,当存在响应的时...

kvmclock时钟虚拟化源代码分析

代码版本:linux-git v4.10.0-rc3 1.kvm clock时钟 struct pvclock_vcpu_time_info { u32   version; u32   pad0; //guest的TSC时间戳,在kvm_guest_time_update中会被更新 u64   tsc_timestamp; //guest的墙上时间(1970年距今的绝对日期),和上者在一起更新 //system_time = kernel_ns + v->k...

epoll的linux内核工作机制

一. epoll用户态使用规范 epoll有2种工作方式:LT和ET。 LT(level triggered,水平触发)是缺省的工作方式,并且同时支持block和no-block socket.在这种做法中,内核告诉你一个文件描述符是否就绪了,然后你可以对这个就绪的fd进行IO操作。如果你不作任何操作,内核还是会继续通知你的,所以,这种模式编程出错误可...

QEMU下的eventfd机制及源代码分析

代码版本linux-3.16.37-git, qemu-v2.8-git 因为eventfd要与epoll配合使用,不清楚epoll的请参考epoll的linux内核工作机制。 一. Eventfd在QEMU下的使用 Eventfd在QEMU下的使用以这三个函数为基础:event_notifier_init和event_notifier_get_fd,以及event_notifier_set_handler。 在event_notifier_init中,初始化E...

KVM源代码分析5:IO虚拟化之PIO

源代码:git tag, kernel v3.16.37 qemu v2.7 ,上一篇:KVM源代码分析4:内存虚拟化–OenHan 1. PIO指令介绍 80386的I/O指令使得处理器可以访问I/O端口,以便从外设输入数据,或者向外设发送数据。这些指令有一个指定I/O空间端口地址的操作数。有两类的I/O指令: 1、 在寄存器指定的地址传送一个数据(字节、字、双字)。...

qemu tcg translation block机制

Base是git://git.qemu.org/qemu.git v2.6.0 入口是qemu_init_vcpu,在tcg_enabled下进入qemu_tcg_init_vcpu函数,在qemu_thread_create(cpu->thread, thread_name, qemu_tcg_cpu_thread_fn, cpu, QEMU_THREAD_JOINABLE)中看到执行函数是qemu_tcg_cpu_thread_fn,下面的函数负责控制在machine完全初始化完成前进行等...

centos 7 安装网易云音乐

在CentOS7上安装网易云音乐,需要启用epel.repo和nux-dextop.repo源。 然后安装如下rpm包,重点是qt5的rpm: $ ldd /usr/lib/netease-cloud-music/netease-cloud-music | cut -d " " -f3 | sort | uniq | xargs rpm -qf | uniq | xargs rpm -q --queryformat "%{NAME} " alsa-lib libasyncns atk libattr avahi...

ext4 mballoc源代码分析

看mballoc一开始是为了解决一个bug,但是代码没看完,bug已经解决了,仅仅是从C代码规范的处理的,和ext4自身逻辑没有什么关系,具体内容参看“ubsan: "shift exponent -1 is negative" in fs/ext4/mballoc.c:2612:15”,Bugzilla链接。 ext4 mballoc特性是用进行一次性的多个块申请分配,官方定义: What is multiblock ...

QEMU monitor savevm loadvm源代码分析

源代码版本:git://git.qemu.org/qemu.git v2.5.0 savevm指令对应的函数是hmp_savevm,loadvm则是hmp_loadvm, 对应的函数是 { .name = "savevm", .args_type = "name:s", .params = "[tag|id]", .help = "save a VM snapshot. If no tag or id are provided, a new snapshot is created", .mhandler....