
虚拟化
文章平均质量分 77
zhuriyuxiao
这个作者很懒,什么都没留下…
展开
-
QEMU 与QEMU-KVM区别
虚拟化到底是什么?且慢,突然想起Linux系统几个类似概念:“物理”(真实)终端、”伪”终端、”虚拟”终端,伪与虚拟有什么区别呢?其实明白两者区别,也就明白什么是虚拟化概念。虚拟化,根据虚拟实体,可以存在多种虚拟化。而这里只想谈谈系统虚拟化。 什么是系统虚拟化呢?顾名思义虚拟计算机系统,就是在物理计算机上虚拟一个或者多个虚拟的计算机。同样道理虚拟终端,虚拟的是物理终端,就是在物理原创 2012-04-21 17:52:22 · 6608 阅读 · 2 评论 -
影子页表虚拟化---INVLPG
影子页表虚拟化---INVLPG当客户机修改客户机页表的表项,客户机执行INVLPG敏感指令刷新TLB部分内容。正常流程为:VMM截获这一操作,并对影子页表项进行相应修改,设置不存在,刷新影子页表部分内容。代码分析:static void FNAME(invlpg)(struct kvm_vcpu *vcpu, gva_t gva){ struct kvm原创 2013-06-05 17:23:07 · 1225 阅读 · 0 评论 -
影子页表页内存管理----分配与回收
影子页表页管理-----分配和回收影子页表页分配static struct kvm_mmu_page *kvm_mmu_alloc_page(struct kvm_vcpu *vcpu, u64 *parent_pte){ struct kvm_mmu_page *sp原创 2013-06-07 15:01:18 · 1243 阅读 · 0 评论 -
虚拟MMU---客户机页表遍历
客户机页表的遍历MMU的功能:虚拟机地址转换为物理地址,下面函数模拟此过程。1.数据结构 struct guest_walker { int level; gfn_t table_gfn[PT_MAX_FULL_LEVELS]; pt_element_t ptes[PT_MAX_FULL_LEVELS]; gp原创 2013-06-08 14:34:40 · 698 阅读 · 0 评论 -
qemu-kvm 内存虚拟化---影子页表
qemu-kvm 内存虚拟化---影子页表影子页表被载入到真正硬件MMU中,通过影子页表进行客户机虚拟地址到宿主机物理地址(gva--->hpa)的转换。由于影子页表项不存在或者访问权限不够,可能导致页故障,这页故障由物理硬件MMU产生的,这些故障被截获,并且进行处理和模拟。影子页表页故障处理流程:1.首先遍历客户机页表,获取页表的结构和内容,判断客户机页表的权限是否足够,原创 2013-06-20 17:22:39 · 1503 阅读 · 0 评论 -
qemu-kvm 内存虚拟化---ept
qemu-kvm内存虚拟化内存虚拟化实际就是进行地址转换从客户机虚拟地址-->客户机物理地址-->宿主机的物理地址,转换实现有两种硬件内存虚拟化和软件影子页表方式, 下面主要分析基于intel ept硬件内存虚拟化实现,此实现主要做两件事情1.开启ept功能2.构造转换页表。注意该页表构造采用动态方式(常说懒惰方式),就是不到完不得以情况不创建。此页表创建实现就是采用ept violati原创 2013-04-17 16:25:20 · 2533 阅读 · 0 评论 -
qemu-kvm virtio 虚拟化-----Linux客户机 virtio设备初始化
Linux客户机 virtio设备初始化virtio设备物理上连接在pci物理总线上,逻辑上连接在virtio虚拟总线。做为pci设备便于资源分配与配置,逻辑设备模型中,便于管理与组织。1.qemu-kvm提供的virtio pci设备virtio-blk(硬盘),virtio-net(网络),virtio-balloon(气球)等pci设备,这些设备连接在pci总线上。代码位于qem原创 2013-07-17 16:58:06 · 2474 阅读 · 0 评论 -
qemu-kvm i/o虚拟化----设备注册和加载
/////////////////////////////////////////////1.注册映像,设备,机器相应数据结构block_init()device_init()machine_init()注意: 上述函数为构造函数__attribute__((constructor)),即在main()函数执行前,相关函数已执行。#define module_原创 2013-07-03 13:40:30 · 1197 阅读 · 0 评论 -
qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存
qemu-kvm 设备虚拟化----I/O 端口和 I/O 内存操作设备存在两种接口:I/O 端口和 I/O 内存,下面分析虚拟机如何截获和模拟这两种情况的。1.用户空间访问内核数据结构信息内存映射可被实现来提供用户程序对设备内存的直接存取,KVM 内核代表每个 VCPU 的 struct kvm_run 数据结构被 mmap用户空间,从而用户空间可以读取 struct kvm原创 2013-07-03 15:03:34 · 1575 阅读 · 0 评论 -
影子页表虚拟化-----反向映射
反向映射 mmu维护一个反向映射, 因此映射这个页的所有页表项,由gfn(客户机页框号)找到映射此页的影子页表项spte。这些情况下:当客户机的宿主机物理页面被交换到硬盘上或者被回收,这是有用的。为什么有用呢?如果客户机的宿主机物理页面被交换到硬盘,影子页表肯定要知道,并且要更新影子页表,设置不存在。下一次客户机访问被交换出去页面,查询影子页表被截获,进行处理。如何更新影子页表呢?原创 2013-06-05 16:39:55 · 909 阅读 · 0 评论 -
客户机物理页框到宿主机虚拟地址转换
对于虚拟机来说, 如果指定1G内存,以slot为单位,进行mmap虚拟内存映射申请,申请之后memset进行物理内存申请,从而占用物理内存。对于宿主机来说mmap申请宿主机虚拟内存为连续的,进行memset初始化发生缺页中断从而申请物理内存,这些宿主机物理内存未必是连续的。对于虚拟机来说,虚拟机物理内存当然是连续的,所以可以让虚拟机物理内存虚拟对应与宿主机虚拟内存。注意:1.slot不是物原创 2013-05-24 10:50:07 · 933 阅读 · 0 评论 -
APIC-access address Virtual-APIC address IA32_APIC_BASE
virtual-APIC页唯一功能是影子化TPR。存在三个有意思地址,三个地址全部都是物理地址(意思是它们没有进行过任何一种转换)1. IA32_APIC_BASE。这个地址包含在MSR中, 这个地址是实际硬件APIC映射的地址。访问这个地址就是访问实际硬件APIC映射的寄存器。VMM将不映射这个物理地址到任何一个客户机地址空间。那意味着(1):如果EPT启用,EPT相应的表项不包含这个地翻译 2013-05-17 15:08:41 · 871 阅读 · 0 评论 -
qemu-kvm 代码分析
物理计算机由处理器,存储器,输入与设备三大部件组成,虚拟机实际也是一台计算机,必然包括这三大组件,所以虚拟技术包括处理机虚拟化,存储器虚拟化,输入与输出设备虚拟化,这些虚拟化是通过软件虚拟还是硬件虚拟呢?接下来看看具体虚拟化软件qemu-kvm是如何处理的?qemu是采用纯软件模拟的技术,kvm暂且认为采用硬件模拟技术, 可见qemu-kvm的虚拟机是硬件辅助虚拟机,其中处理机虚拟化和存储器虚原创 2013-03-22 15:52:20 · 1670 阅读 · 1 评论 -
qemu-kvm 线程事件模型
qemu-kvm 线程事件模型1.主(父)线程。主线程执行循环,主要做三件事情1).执行select操作,查询文件描述符有无读写操作2).执行定时器回调函数3).执行下半部(BH)回调函数。为什么要采用BH,资料说主要避免可重入性和调用栈溢出。2.执行客户机代码的线程只讨论kvm执行客户机代码情况(不考虑TCG,TCG采用动态翻译技术),如果有多个vcpu,就意味着原创 2013-04-22 17:26:45 · 1114 阅读 · 0 评论 -
spice 鼠标移动代码分析
spice工作过程,相当繁琐。其中经过组件依次为1.客户端(例如spicec,spicy)2.spice-server3.qemu-kvm4.guest具体流程可参照网上资料,下面分析spice鼠标移动事件工作过程,spice鼠标相对其他是比较简单的。1.客户端spice mouse鼠标的移动操作鼠标在Linux spice客户端进行移动时X11引擎捕获该事件原创 2013-04-24 15:45:19 · 1651 阅读 · 0 评论 -
qemu-kvm 中断虚拟化代码分析
硬件中断发生(qemu模拟设备)1.硬件产生中断的接口void qemu_set_irq(qemu_irq irq, int level);2.中断过程void qemu_set_irq(qemu_irq irq, int level){ if (!irq) return; irq->handler(irq->opaque, irq原创 2013-04-16 17:32:28 · 1768 阅读 · 0 评论 -
Qemu-kvm模拟APIC Timer中断
Qemu-kvm模拟APIC Timer中断qemu-kvm模拟两个时钟中断设备PIT(i8254)和APIC Timer设备,也就是产生中断源。两者电子线路连接不同,对于i8254设备来说首先连接到i8259中断控制器,i8259中断控制器再连接到ioapic设备中,送到lapic,最后注入到vcpu中。对于APIC Timer设备实际就是lapic的一个功能,意思就是通过编程可以触发l原创 2013-04-17 11:32:54 · 1414 阅读 · 0 评论 -
qemu-kvm虚拟化 vpid 代码分析
qemu-kvm虚拟化 vpid 代码分析1.页表实现线性地址到物理地址转换。2.ept (Extended Page Tables)实现客户机物理地址到宿主机物理地址装换。3.tlb (Translation lookaside buffer )旁路装换缓冲区,改进虚拟地址(线性地址)到物理地址转换速度的缓存。操作系统中我们知道每个进程都有自己页表,进程切换重新设置c原创 2013-04-18 14:40:53 · 920 阅读 · 0 评论 -
qemu i/o虚拟化-- virtio-blk设备
qemu-kvm virtio-blk设备virtio-blk为半虚拟驱动,virtio-blk请求处理过程如下:1.客户机(virtio-blk设备驱动)读写数据方式vring队列2.客户机执行Virtqueue队列函数kick通知host宿主机(通过virtio-pci硬件寄存器发送通知)3.宿主机host截获通知信息4.宿主机host从vring队列获取读写请求(vrin原创 2013-04-19 16:01:34 · 3379 阅读 · 5 评论 -
qemu i/o虚拟化-- ide设备
首先了解一下Linux的文件操作,接下来看一下qemu对于ide设备虚拟化过程一)学习Linux的文件操作涉及分层-----------虚拟文件层vfs-----------磁盘设备缓存(directio不存在)----------块设备层(包括映射,调度)---------块设备驱动---------硬件设备----------二)原创 2013-04-18 14:53:01 · 1368 阅读 · 0 评论 -
Linux驱动----PCI 驱动开发实例
详细原理不介绍, 参照《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,以及qemu-kvm虚拟化设备模拟,以及其他设备中断,端口读写等等, 涉及知识较多,应该是一个综合实例。多余不必叙述,可参考下面代码。由于该实例涉及知识较多,建议首先学习《Linux 设备驱动 Edition 3》中第16章块设备驱动,第12章 PCI 驱动开发,再尝试该实例。注原创 2013-08-30 10:50:56 · 1266 阅读 · 0 评论