书籍作者:王柏生 | ISBN:9787111666066 |
书籍语言:简体中文 | 连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 | 下载次数:7416 |
创建日期:2021-02-14 | 发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
内容简介
这是一部深度讲解如何在Linux操作系统环境下用软件虚拟出一台“物理”计算机的著作。
两位作者都是百度的技术专家,一位是百度的主任架构师,一位是百度智能云的副总经理,都在操作系统和虚拟化等领域有多年的实践经验。本书从计算机体系结构、操作系统、硬件等多个方面深度探索了如何从CPU、内存、中断、外设、网络5个维度去虚拟化Linux系统,不仅剖析了其中的关键技术原理,而且深入阐述了具体的实现。
全书共6章:
第1章:CPU虚拟化
介绍了X86架构下的VMX扩展,讨论了在VMX下虚拟CPU的完整生命周期,着重阐述了Host和Guest的切换、指令的模拟以及KVM是如何虚拟多处理器的。
第2章:内存虚拟化
讨论了操作系统如何为虚拟机呈现物理内存,结合影子页表以及EPT探讨了KVM如何完成从GVA到HPA的2层地址映射。
第3章:中断虚拟化
首先,讨论了从单核系统的8259A开始,到多核系统的APIC,再到绕开I/O APIC直接从设备向LAPIC发送基于消息的MSI的虚拟化原理和实现。然后,讨论了Intel为了提高效率,是如何从硬件层面对虚拟化中断进行支持的,以及KVM是如何使用它们的。
第4~5章 外设虚拟化
从完全虚拟化开始,依次讲解了半虚拟化(Virtio)和Intel的VT-d支持下的硬件辅助虚拟化。通过实现一个模拟串口带领读者直观体会了设备虚拟化的基本原理,然后深入阐述了Virito标准和实现,以及支持SR-IOV的DMA重映射和中断重映射。
第6章 网络虚拟化
讨论了在通用硬件网络的基础上,操作系统如何虚拟出专用的网络设备,为租户组建虚拟网络。
作者简介
王柏生
技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富的实践经验。
著有畅销书《深度探索Linux操作系统》(2013年出版)。
谢广军
计算机专业博士,毕业于南开大学计算机系。
技术专家,有多年的IT行业工作经验。现担任百度智能云副总经理,负责云计算相关产品的研发。多年来一直从事操作系统、虚拟化技术、分布式系统、大数据、云计算等相关领域的研发工作,实践经验丰富。
(1)两位作者分别是百度的主任架构师和百度智能云副总裁,在操作系统和虚拟化领域有近20年的研究和实践经验。
(2)虚拟化是云计算的基石,两位作者在云计算领域也有非常深入的研究和非常深厚的积累。
(3)两位作者历史5年,两易其稿,高标准、严要求完成的心血之作,初心是为行业的后来者留下一分传承。
(4)内容扎实,从CPU、内存、中断、外设、网络5个维度深入讲解Linux系统虚拟化的技术原理和实现
为何写作本书
大约在2014年底,我参与了一个项目,使用Android模拟器在x86架构的机器上运行各种Android游戏。当时项目遇到的核心问题是游戏运行卡顿严重,印象中普通的小游戏每秒大约只能渲染十几帧,大型游戏则完全无法成功加载。运行模拟器的机器都有顶配的显卡,因此硬件性能并不存在问题。那么问题就出在软件架构上了。当时采用的软件架构是:使用虚拟机运行Android程序,Android中有一个模块会将数据通过网络传送给另外一个本地应用进行渲染。对于游戏这种数据量很大的应用,采用网络包传输显然不是一个最优的方案。除了网络包在协议栈中的各种复杂处理外,大量的网络包传输会导致虚拟机和主机之间的频繁切换,这将耗费大量的计算资源。基于此,我们设计的新方案是在VMM层实现一个虚拟设备,在Guest内部通过这个虚拟设备向渲染程序发送数据。虚拟设备通过IPC方式与负责渲染的程序进行通信。方案实现后,原来无法加载的大型游戏每秒都可以达到Android的渲染上限60帧。
2015年我参与了另外一个项目,将虚拟机的块设备数据存储到块存储集群。原有的方案是在宿主机上采用SCSI创建一个块设备,然后将这个块设备传给Qemu,SCSI设备再通过iSCSI协议将块数据传递给远端块存储集群。这个方案有很多弊端,块数据经历了两次
I/O栈,一次是Guest内核中的,另外一次是Host内核中的,因此效率很低。另外,这个方案还有个致命的问题:那时偶尔会遇到内核中iSCSI协议的Bug,此时除了重启宿主机外别无他法,而且那时热迁移还不是很成熟,可以想象一下重启宿主机的后果。为了解决这些问题,我们设计了另外一种方案,在Qemu中实现一个虚拟块设备,绕过内核的I/O栈,在该虚拟块设备中直接将块数据通过TCP/IP发给块存储集群,从而不再依赖iSCSI协议。方案实现后,IOPS获得了极大的提升,系统的稳定性也增强了。
经历了很多类似上述的情况,因此我打算写一本Linux系统虚拟化方面的书,希望能让读者更深刻地认识和理解系统虚拟化,于是我和本书的第二作者谢广军博士相约,一起撰写本书。从2015年开始,历时近6年,中间历经多次易稿,从最开始过多地聚焦于烦琐的技术细节,到尝试从系统结构、操作系统和硬件等多角度去解释原委。书中全部采用可以说明问题的早期代码版本,而不是采用因各种特性迭代而变得纷繁复杂的最新代码。
在这5年多的时间里,每每不想坚持时,就会想起自己年轻气盛时经常质疑前辈们为我们留下了什么,而如今我扪心自问,从事了这么多年计算机工作,我又为这个行业做了什么?最后,希望本书能让大家有所收获。
读者对象
虚拟化是云计算的基础,此书写给云计算相关从业人员,也写给希望学习云计算相关技术的院校学生,以及Linux系统虚拟化的爱好者。
如何阅读本书
本书探讨了软件如何虚拟计算机系统,包括CPU、内存、中断和外设等。此外,在云计算中,网络虚拟化也至关重要,因此,本书最后一章探讨了网络虚拟化。
第1章讨论CPU虚拟化。这一章介绍了x86架构下的VMX扩展,讨论了在VMX下虚拟CPU的完整生命周期。以Guest通过内存映射(MMIO)方式访问外设为例,展示了KVM如何完整地模拟一个CPU指令。然后,我们探讨了KVM是如何模拟多处理器系统的。最后,通过一个具体的KVM用户空间部分的实例,带领读者直观地体会CPU虚拟化的概念。
第2章讨论内存虚拟化。这一章首先简略地介绍了内存寻址的基本原理,然后分别探讨了实模式Guest以及保护模式Guest的内存寻址,包括大家比较熟悉的影子页表等。最后,我们讨论了在硬件虚拟化支持下,即EPT模式下从Guest的虚拟地址到Host的物理地址的翻译过程。
第3章讨论中断虚拟化。这一章我们从最初IBM PC为单核系统设计的PIC(8259A)开始,讨论到为多核系统设计的APIC,再到绕开I/O APIC、从设备直接向LAPIC发送基于消息的MSI。最后,我们讨论了Intel为了提高效率是如何从硬件层面对虚拟化中断进行支持的,以及KVM是如何使用它们的。
第4章和第5章讨论外设虚拟化。我们从完全虚拟化开始,讨论到半虚拟化,最后讨论到Intel的VT-d支持下的硬件辅助虚拟化。其间,我们通过实现一个模拟串口,带领读者直观地体会设备虚拟化的基本原理,然后带领读者深入了解Virito标准。最后,我们还探讨了支持SR-IOV的DMA重映射和中断重映射。
第6章以一个典型的Overlay网络为例,从虚拟机访问外部主机、外部主机访问虚拟机两个方面,分别探讨了计算节点、网络节点上的网络虚拟化技术。
勘误和支持
由于作者水平和编写时间有限,书中难免出现一些错误或者不准确的地方,恳请读者批评指正。来信请发送至邮箱[email protected]或[email protected],我们会尽自己最大努力给予回复。
致谢
特别感谢机械工业出版社华章公司的杨福川编辑,在这5年多的时间里,他不断地鼓励我,耐心地支持我写作。在我每每要放弃时,都是他的鼓励让我坚持了下来。同他的一次对话令我印象深刻,我问他如何看待“偏底层的题材比较小众”这一问题,他坚毅地回答:只要是有价值的知识,总得有人来做,这是他的使命。
同时也要感谢机械工业出版社华章公司的栾传龙编辑,他为本书花费了大量的个人时间,
前 言
第1章 CPU虚拟化 1
1.1 x86架构CPU虚拟化 1
1.1.1 陷入和模拟模型 2
1.1.2 x86架构虚拟化的障碍 2
1.1.3 VMX 3
1.1.4 VCPU生命周期 5
1.2 虚拟机切入和退出 8
1.2.1 GCC内联汇编 8
1.2.2 虚拟机切入和退出及相关的上下文保存 10
1.3 陷入和模拟 15
1.3.1 访问外设 15
1.3.2 特殊指令 22
1.3.3 访问具有副作用的寄存器 27
1.4 对称多处理器虚拟化 28
1.4.1 MP Table 28
1.4.2 处理器启动过程 33
1.5 一个简单KVM用户空间实例 41
1.5.1 创建虚拟机实例 43
1.5.2 创建内存 43
1.5.3 创建处理器 44
1.5.4 Guest 46
1.5.5 加载Guest镜像到内存 47
1.5.6 运行虚拟机 47
第2章 内存虚拟化 49
2.1 内存寻址 49
2.1.1 段式寻址 50
2.1.2 平坦内存模型 50
2.1.3 页式寻址 54
2.1.4 页式寻址实例 55
2.2 VMM为Guest准备物理内存 61
2.2.1 内核是如何获取内存的 62
2.2.2 建立内存段信息 64
2.2.3 准备中断0x15的处理函数以及设置IVT 65
2.2.4 中断0x15的处理函数实现 68
2.2.5 虚拟内存条 69
2.3 实模式Guest的寻址 72
2.3.1 设置CPU运行于Virtual-8086模式 74
2.3.2 设置Guest模式下的cr3寄存器 75
2.3.3 虚拟MMU的上下文 75
2.3.4 缺页异常处理 77
2.4 保护模式Guest的寻址 81
2.4.1 偷梁换柱cr3 83
2.4.2 影子页表缺页异常处理 86
2.5 EPT 92
2.5.1 设置EPT页表 93
2.5.2 EPT异常处理 95
2.5.3 EPT支持下的地址翻译过程 97
第3章 中断虚拟化 99
3.1 虚拟中断 99
3.2 PIC虚拟化 102
3.2.1 可编程中断控制器8259A 103
3.2.2 虚拟设备向PIC发送中断请求 106
3.2.3 记录中断到IRR 107
3.2.4 设置待处理中断标识 108
3.2.5 中断评估 110
3.2.6 中断ACK 112
3.2.7 关于EOI的处理 113
3.2.8 中断注入 114
3.3 APIC虚拟化 116
3.3.1 外设中断过程 118
3.3.2 核间中断过程 123
3.3.3 IRQ routing 125
3.4 MSI(X)虚拟化 128
3.4.1 MSI(X)Capability数据结构 129
3.4.2 建立IRQ routing表项 131
3.4.3 MSI设备中断过程 132
3.5 硬件虚拟化支持 134
3.5.1 虚拟中断寄存器页面(virtual-APIC page) 134
3.5.2 Guest模式下的中断评估逻辑 136
3.5.3 posted-interrupt processing 139
第4章 设备虚拟化 142
4.1 设备虚拟化模型演进 142
4.2 PCI配置空间及其模拟 144
4.3 设备透传 152
4.3.1 虚拟配置空间 153
4.3.2 DMA重映射 157
4.3.3 中断重映射 160
4.4 完全虚拟化 166
4.4.1 Guest发送数据 167
4.4.2 Guest接收数据 173
第5章 Virtio虚拟化 182
5.1 I/O栈 182
5.1.1 文件系统 182
5.1.2 通用块层 190
5.1.3 块设备驱动 194
5.1.4 page cache 196
5.1.5 bio 201
5.1.6 I/O调度器 202
5.2 Virtio协议 204
5.2.1 描述符表 205
5.2.2 可用描述符区域 207
5.2.3 已用描述符区域 208
5.2.4 Virtio设备的PCI配置空间 209
5.3 初始化Virtqueue 210
5.4 驱动根据I/O请求组织描述符链 216
5.5 驱动通知设备处理请求 221
5.6 设备处理I/O请求 222
5.7 驱动侧回收I/O请求 226
5.8 设备异步处理I/O 229
5.9 轻量虚拟机退出 231
5.9.1 创建eventfd 232
5.9.2 kvmtool监听eventfd 235
5.9.3 VM exit处理函数唤醒I/O任务 236
第6章 网络虚拟化 239
6.1 基于Overlay的虚拟网络方案 239
6.1.1 计算节点 240
6.1.2 网络节点 247
6.1.3 Open vSwitch 251
6.2 虚拟机访问外部主机 255
6.2.1 数据包在计算节点Linux网桥中的处理 256
6.2.2 数据包在计算节点的Open vSwitch中的处理 257
6.2.3 数据包在网络节点的Open vSwitch中的处理 265
6.3 外部主机访问虚拟机 272
6.3.1 数据包在网关中的处理过程 273
6.3.2 数据包在网络节点的Open vSwitch中的处理 274
6.3.3 数据包在计算节点的Open vSwitch中的处理 279
6.3.4 数据包在Linux网桥中的处理 283
这本书非常不错,实用性强,强烈推荐。
2020-10-28 23:54:41
不错不错不错不错不错不错
2020-10-28 09:52:12