操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

43 | 虚拟机内核:KVM是什么?

设计虚拟化平台时需要考虑的问题
CPU、RAM、I/O的虚拟化原理
KVM的基本架构
对资源进行“欺上瞒下”
I/O虚拟化
内存虚拟化
vCPU运行
创建vCPU
创建虚拟机
I/O虚拟化原理
内存虚拟化原理
CPU虚拟化原理
Hypervisor模拟硬件资源
KVM的架构图
Intel的硬件虚拟化技术
软件虚拟化技术 vs. 硬件虚拟化技术
赵高的瞒天过海
引入Hypervisor/VMM层
资源复用问题
操作系统的资源配置
最大化使用物理资源
转换和抽象实体资源
资源管理技术
思考题
重点回顾
KVM关键代码走读
KVM核心原理
KVM架构梳理
用赵高矫诏谈理解虚拟化
虚拟化的核心思想
虚拟化的定义
KVM虚拟化技术

该思维导图由 AI 生成,仅供参考

你好,我是 LMOS。
上节课,我们理解了 Linux 里要如何实现系统 API。可是随着云计算、大数据和分布式技术的演进,我们需要在一台服务器上虚拟化出更多虚拟机,还要让这些虚拟机能够弹性伸缩,实现跨主机的迁移。
而虚拟化技术正是这些能力的基石。这一节课,就让我们一起探索一下,亚马逊、阿里、腾讯等知名公司用到的云虚拟主机,看看其中的核心技术——KVM 虚拟化技术。

理解虚拟化的定义

什么是虚拟化?在我看来,虚拟化的本质是一种资源管理的技术,它可以通过各种技术手段把计算机的实体资源(如:CPU、RAM、存储、网络、I/O 等等)进行转换和抽象,让这些资源可以重新分割、排列与组合,实现最大化使用物理资源的目的

虚拟化的核心思想

学习了前面的课程我们发现,操作系统的设计很高明,已经帮我们实现了单机的资源配置需求,具体就是在一台物理机上把 CPU、内存资源抽象成进程,把磁盘等资源抽象出存储、文件、I/O 等特性,方便之后的资源调度和管理工作。
但随着时间的推移,我们做个统计就会发现,其实现在的 PC 机平常可能只有 50% 的时间处于工作状态,剩下的一半时间都是在闲置资源,甚至要被迫切换回低功耗状态。这显然是对资源的严重浪费,那么我们如何解决资源复用的问题呢?
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

KVM虚拟化技术是一种通过对计算机实体资源进行转换和抽象,实现资源重新分割、排列与组合的技术。文章介绍了KVM的核心思想,即通过Hypervisor/Virtual Machine Monitor(VMM)层实现资源的统一管理和调度,以及对客户机提供虚拟化的假象。KVM的架构图展示了其复杂性,但通过大白话梳理,可以理解其基本原理。CPU虚拟化利用VMX处理器特性实现根操作和非根操作模式的切换,而内存虚拟化则通过EPT机制提升内存地址转换效率。文章以历史人物赵高的故事形象地阐述了虚拟化的核心原理,强调了资源的“欺上瞒下”关键性。整体而言,KVM虚拟化技术通过对CPU、内存和I/O等重要资源的虚拟化,实现了对物理资源的最大化利用,为云计算、大数据和分布式技术的发展提供了重要支持。文章还对KVM的关键代码进行了走读,深入解析了创建虚拟机、创建vCPU、vCPU运行、内存虚拟化和I/O虚拟化等关键过程。最后,文章提出了思考题,引发读者对虚拟化平台设计的思考和讨论。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • pedro
    置顶
    以我所在的腾讯云为例。 腾讯云服务器 CVM 支持用户自定义一切资源:CPU、内存、硬盘、网络、安全等,并可以在需求发生变化时轻松地调整它们,还支持随时扩容,迁移,运维等管理功能。 一个成熟的IAAS平台搭建起来不容易啊,要考虑的事情太多了。

    作者回复: 如果只是在一台物理机上开启多个虚拟机KVM确实已经做的很棒了,但是如果我们扩展到多个机架、多个机房,问题就变得更加复杂了。我们除了要考虑之前讲过的网络问题,好需要考虑分布式环境下的计算、存储、消息传输、状态同步、动态迁移、扩缩容、镜像、身份认证、编排与调度、UI管理面板等很多问题。当然,业界也有一些开源解决方案,比如大名鼎鼎的OpenStack,不过笔者觉得OpenStack由于设计实现的比较早,所以存在集群规模有限、部署、维护、二次开发复杂度高、历史包袱重等问题,所以和多位架构师沟通交流之后我们正在尝试重新设计并实现一套更现代化的轻量级的IAAS云平台,感兴趣的同学可以加入群多多交流。

    2021-08-16
    4
    12
  • 苏流郁宓
    置顶
    装虚拟机出现过ghost系统(如win系统ghost版),在VM虚拟机上面识别不了,需要装原版官网下载的非ghost版本才安装成功,以及AMD的cpu装苹果系统也没成功,故认为开发虚拟机系统(如VM),需要对厂家的cpu指令以及各系统的启动流程有一定的了解。如此才好“欺骗”,虚拟机安装系统失败的很大部分原因是没找对原版系统,也就是修改过的系统启动流程和虚拟机表中的流程不完全一致,识别不了。 故,认为开发虚拟机可以单独做一个启动表(允许修改),还有就是扫描表,就是在安装系统前对要装的系统进行扫描,识别不了的东西也显示出来,方便用户网上查询和修改参数,而不是猜。还有就是文件格式的识别需要改进,iso或者dmg都能识别最好,这样覆盖的厂家更多! 还可以设计一种网络虚拟机,就是虚拟机装在A电脑上,但是用户在B电脑上,用户的操作通过平台翻译成标准信息输出,然后传送到A电脑上,这样就不用考虑用户在B电脑(手机)用的是什么系统,硬件性能如何。只要他能联网就行,这样可以在A电脑上允许多个用户分时间操作,更能利用好资源。

    作者回复: 66666

    2021-08-16
    2
    2
  • neohope
    二、下半部分 5、在调用ioctl时 SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_vm_ioctl kvm_vm_ioctl->kvm_vm_ioctl_create_vcpu ->kvm_arch_vcpu_precreate ->kvm_vcpu_init ->kvm_arch_vcpu_create ->kvm_get_kvm ->create_vcpu_fd,生成设备文件inode ->kvm_arch_vcpu_postcreate 其中,kvm_arch_vcpu_create ->kvm_mmu_create ->vcpu->arch.user_fpu = kmem_cache_zalloc(x86_fpu_cache, GFP_KERNEL_ACCOUNT); ->kvm_pmu_init(vcpu); ->kvm_hv_vcpu_init(vcpu); ->kvm_x86_ops.vcpu_create(vcpu); ->kvm_vcpu_mtrr_init(vcpu); ->vcpu_load(vcpu); ->kvm_vcpu_reset(vcpu, false); ->kvm_init_mmu(vcpu, false); //包括init_kvm_tdp_mmu和init_kvm_softmmu两种虚拟化方式 6、启动虚拟机,还是文件操作 static struct file_operations kvm_vcpu_fops = { .release = kvm_vcpu_release, .unlocked_ioctl = kvm_vcpu_ioctl, .mmap = kvm_vcpu_mmap, .llseek = noop_llseek, KVM_COMPAT(kvm_vcpu_compat_ioctl), }; 7、在调用ioctl时KVM_RUN SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_vcpu_ioctl kvm_vcpu_ioctl-> case KVM_RUN: kvm_arch_vcpu_ioctl_run 其中,kvm_arch_vcpu_ioctl_run->vcpu_run->vcpu_enter_guest 8、IO同样有虚拟化和半虚拟化两种,一个处理函数为kvm_fast_pio,另一个为kvm_emulate_instruction

    作者回复: 老哥对KVM也有研究啊

    2021-08-24
    7
  • neohope
    一、上半部分 1、内核模块初始化 module_init(vmx_init)->kvm_init module_init(svm_init)->kvm_init 其中,kvm_init ->kvm_arch_init ->kvm_irqfd_init ->kvm_arch_hardware_setup ->misc_register(&kvm_dev) 2、从数据结构角度,又可以看到了设备皆为文件的思想 static struct miscdevice kvm_dev = { KVM_MINOR, "kvm", &kvm_chardev_ops, }; static struct file_operations kvm_chardev_ops = { .unlocked_ioctl = kvm_dev_ioctl, .llseek = noop_llseek, KVM_COMPAT(kvm_dev_ioctl), }; 通过misc_register,实现了操作的绑定。 3、通过上面的数据结构,我们就可以找到创建虚拟机的方法,并生成控制文件 kvm_dev.kvm_chardev_ops.kvm_dev_ioctl ioctl系统调用KVM_CREATE_VM,效果也是一样的: SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) ->vfs_ioctl,会用到vfs_ioctl.unlocked_ioctl也就是kvm_dev_ioctl ->case KVM_CREATE_VM: -> r = kvm_dev_ioctl_create_vm(arg); ->file = anon_inode_getfile("kvm-vm", &kvm_vm_fops, kvm, O_RDWR); 其中,kvm_dev_ioctl_create_vm ->kvm_create_vm ->->kvm_arch_init_vm ->->hardware_enable_all ->->kvm_arch_post_init_vm ->->list_add(&kvm->vm_list, &vm_list); 4、生成虚拟CPU套路很相似,仍是文件操作 static struct file_operations kvm_vm_fops = { .release = kvm_vm_release, .unlocked_ioctl = kvm_vm_ioctl, .llseek = noop_llseek, KVM_COMPAT(kvm_vm_compat_ioctl), }; 创建虚拟机时,anon_inode_getfile("kvm-vm", &kvm_vm_fops, kvm, O_RDWR),实际上就把文件和kvm_vm_fops绑定了起来。

    作者回复: 是的 6666

    2021-08-24
    5
  • 吴建平
    文中用到的kvm的源码,是linux的么,哪个版本的,或者去哪里可以下载到对应源码

    作者回复: 对 kvm直接 是在Linux内核中的

    2022-08-29归属地:湖北
  • 西门吹牛
    老师,JVM 属于软虚拟还是硬虚拟?

    作者回复: 不用Jit的JVM是软虚拟

    2022-07-08
  • ifelse
    秀啊

    作者回复: 哈哈

    2022-02-27
  • 云师兄
    软硬结合才是虚拟化的关键啊!

    作者回复: 是的 是的

    2021-09-08
  • springXu
    这课的例子和内容相当精彩,还是意犹未尽呀。由于虚拟化知识欠缺了,想问还有后续不?

    作者回复: 暂时没有 可能加餐

    2021-08-16
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部