随笔分类 -  KVM虚拟化技术

摘要:2018-01-24 占个坑,准备下写vhost-user的东西 vhost-user是vhost-kernel又回到用户空间的实现,其基本思想和vhost-kernel很类似,不过之前在内核的部分现在有另外一个用户进程代替,可能是snapp或者dpdk等。在网上看相关资料较少,就简单介绍下。虽然和 阅读全文
posted @ 2018-02-02 14:08 jack.chen 阅读(5186) 评论(8) 推荐(0) 编辑
摘要:2018-01-18 其实在之前的文章中已经简要介绍了VHOST中通过irqfd通知guest,但是并没有对irqfd的具体工作机制做深入分析,本节简要对irqfd的工作机制分析下。这里暂且不讨论具体中断虚拟化的问题,因为那是另一个内容,这里仅仅讨论vhost如何使用中断的方式对guest进行通知, 阅读全文
posted @ 2018-01-18 14:57 jack.chen 阅读(3708) 评论(0) 推荐(0) 编辑
摘要:2017-11-15 今天闲着没有突然想了想VCPU线程调度的问题,具体描述如下: 当代表VCPU的线程获得控制权后,首先会通过KVM接口进入到内核,从内核进入到非根模式,那么此时站在全局调度器的点上,这并不算做线程的时间,这种情况下调度器还能正常调度VCPU线程吗? 通过查看intel手册,分析相 阅读全文
posted @ 2017-11-15 19:00 jack.chen 阅读(2698) 评论(0) 推荐(0) 编辑
摘要:2017-08-24 今天咱们聊聊KVM中断虚拟化,虚拟机的中断源大致有两种方式,来自于用户空间qemu和来自于KVM内部。 中断虚拟化起始关键在于对中断控制器的虚拟化,中断控制器目前主要有APIC,这种架构下设备控制器通过某种触发方式通知IO APIC,IO APIC根据自身维护的重定向表pci 阅读全文
posted @ 2017-09-04 19:25 jack.chen 阅读(6684) 评论(0) 推荐(1) 编辑
摘要:2017-07-19 一、前言 之前有分析过虚拟化环境下virtIO的实现,virtIO相关于传统的虚拟IO在性能方面的确提高了不少,但是按照virtIO虚拟网卡为例,每次虚拟机接收数据包的时候,数据包从linux bridge经过tap设备发送到用户空间,这是一层数据的复制并且伴有内核到用户层的切 阅读全文
posted @ 2017-08-23 09:18 jack.chen 阅读(10858) 评论(4) 推荐(1) 编辑
摘要:2017-06-30 在KVM中基于其搞特权及,可以透明的读写客户机的内存信息,为此KVM提供了一套API,这里姑且称之为kvm_read_guest_virt*/kvm_write_guest_virt*函数,因为根据不同的场景会由不同的函数,但是基本的原理都是一样的,具体如下所示 kvm_rea 阅读全文
posted @ 2017-07-02 12:38 jack.chen 阅读(1476) 评论(0) 推荐(0) 编辑
摘要:2017-05-30 前几天简要分析了linux remap机制,虽然还有些许瑕疵,但总算大致分析的比较清楚。今天分析下EPT下的逆向映射机制。EPT具体的工作流程可参考前面博文,本文对于EPT以及其工作流程不做过多介绍,重点介绍逆向映射机制。其实逆向映射机制在最主要的作用就是映射的逆向,说了等于白 阅读全文
posted @ 2017-05-30 16:52 jack.chen 阅读(3475) 评论(1) 推荐(0) 编辑
摘要:2017-04-26 KSM是内核中的一种内存共享机制,在2.6.36版本的内核中开始引入,简单来说就是其会 合并某些相同的页面以减少页面冗余。在内核中有一个KSM守护进程 ksmd,它定期扫描用户向它注册的内存区,寻找相同的页面,从而用一个添加写保护的页面来代替, 当有进程尝试写入的时候,会自动分 阅读全文
posted @ 2017-05-10 11:02 jack.chen 阅读(7502) 评论(0) 推荐(0) 编辑
摘要:2016-09-27 前篇文章通过分析源代码,大致描述了各个数据结构之间的关系是如何建立的,那么今天就从数据包的角度,分析下数据包是如何在这些数据结构中间流转的! 这部分内容需要结合前面两篇文章来看,我们还是按照从Tap设备->Hub->NIC的流程。 首先看Tap设备,在Tap.c文件中: 先看下 阅读全文
posted @ 2017-05-09 12:45 jack.chen 阅读(2271) 评论(0) 推荐(0) 编辑
摘要:2017-04-20 上篇文章对qemu部分的内存虚拟化做了介绍,上篇文章对于要添加的FR,调用了 MEMORY_LISTENER_UPDATE_REGION(frnew, as, Forward, region_add) 该宏实际上是另一个宏MEMORY_LISTENER_CALL的封装,在MEM 阅读全文
posted @ 2017-04-23 20:23 jack.chen 阅读(2673) 评论(0) 推荐(0) 编辑
摘要:背景分析: 在之前分析EPT violation的时候,没有太注意qemu进程页表和EPT的关系,从虚拟机运行过程分析,虚拟机访存使用自身页表和EPT完成地址转换,没有用到qemu进程页表,所以也就想当然的认为虚拟机使用的物理页面在qemu进程的页表中没有体现。但是最近才发现,自己的想法是错误的。L 阅读全文
posted @ 2017-04-23 20:16 jack.chen 阅读(2690) 评论(0) 推荐(0) 编辑
摘要:2017-04-18 记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下qemu在最初是如何申请并管理虚拟机内存的,坦白讲,还真挺复杂的。 一、概述 qemu-kvm 模型 阅读全文
posted @ 2017-04-20 11:11 jack.chen 阅读(5850) 评论(6) 推荐(2) 编辑
摘要:2016-11-08 在虚拟化环境下,intel CPU在处理器级别加入了对内存虚拟化的支持。即扩展页表EPT,而AMD也有类似的成为NPT。在此之前,内存虚拟化使用的一个重要技术为影子页表。 背景: 在虚拟化环境下,虚拟机使用的是客户机虚拟地址GVA,而其本身页表机制只能把客户机的虚拟地址转换成客 阅读全文
posted @ 2016-11-16 19:55 jack.chen 阅读(19618) 评论(0) 推荐(0) 编辑
摘要:2016-11-08 前段时间大致整理了下virtIO后端驱动的工作模式以及原理,今天就从前端驱动的角度描述下目前Linux内核代码中的virtIO驱动是如何配合后端进行工作的。 注:本节代码参考Linux 内核3.11.1代码 virtIO驱动从架构上来讲可以分为两部分,一个是其作为PCI设备本身 阅读全文
posted @ 2016-11-15 15:48 jack.chen 阅读(8599) 评论(2) 推荐(0) 编辑
摘要:2016-11-15 本来这是在前端驱动后期分析的,但是这部分内容比较多,且分析了后端notify前端的机制,所以还是单独拿出一节分析比较好! 还是拿网络驱动部分做案例,网络驱动部分有两个队列,(忽略控制队列):接收队列和发送队列;每个队列都对应一个virtqueue,两个队列之间是互不影响的。 前 阅读全文
posted @ 2016-11-15 15:43 jack.chen 阅读(13711) 评论(5) 推荐(2) 编辑
摘要:2016-10-08 virtIO是一种半虚拟化驱动,广泛用于在XEN平台和KVM虚拟化平台,用于提高客户机IO的效率,事实证明,virtIO极大的提高了VM IO 效率,配备virtIO前后端驱动的情况下,客户机IO效率基本达到和宿主机一样的水平。咱们本次的分析以qemu-kvm架构的虚拟化平台为 阅读全文
posted @ 2016-11-06 16:25 jack.chen 阅读(15865) 评论(6) 推荐(0) 编辑
摘要:由于功能需要,体验了手动编译安装Libvrt,还是碰到了不少问题,这里总结如下仅限于centos7: 1、configure: error: You must install the pciaccess module to build with udev 解决方案:yum install libpc 阅读全文
posted @ 2016-11-02 19:08 jack.chen 阅读(4397) 评论(0) 推荐(0) 编辑
摘要:因为要给特殊的虚拟机关联文件指定selinux标签,而默认的Libvirt没有这个功能,所以需要修改LIbvirt源代码,重新编译安装Libvirt,而手动编译安装的LIbvirt,没有办法使用systemctl管理libvirtd服务,只能通过libvirtd -d的方式手动启动。然而,手动启动的 阅读全文
posted @ 2016-11-02 18:44 jack.chen 阅读(7928) 评论(0) 推荐(0) 编辑
摘要:sVirt概述 前面已经对seLInux的基本原理做了分析,seLinux主要就是基于主体和客体的安全上下文,进行访问决策。那么安全上下文是不是又可以理解为一个标签呢? 基于以上seLInux的特性,便可以考虑吧seLinux这种基于标签的思想应用到保障Hypervisor的安全上,这里主要是解决两 阅读全文
posted @ 2016-09-27 20:52 jack.chen 阅读(1576) 评论(0) 推荐(0) 编辑
摘要:2016-09-27 上篇文章大致介绍了qemu网络虚拟化相关的数据结构,本篇就结合qemu-kvm源代码分析下各个数据结构是如何初始化以及建立联系的。 这里还是分为三个部分: 1、Tap设备区 2、Hub区 3、NIC区 1、Tap设备区 在net.c中有数组记录下net client 初始化的相 阅读全文
posted @ 2016-09-27 20:51 jack.chen 阅读(1720) 评论(0) 推荐(1) 编辑

以马内利