50 | 计算虚拟化之CPU(上):如何复用集团的人力资源?
刘超
该思维导图由 AI 生成,仅供参考
上一节,我们讲了一下虚拟化的基本原理,以及 qemu、kvm 之间的关系。这一节,我们就来看一下,用户态的 qemu 和内核态的 kvm 如何一起协作,来创建虚拟机,实现 CPU 和内存虚拟化。
这里是上一节我们讲的 qemu 启动时候的命令。
1. 初始化所有的 Module
第一步,初始化所有的 Module,调用下面的函数。
上一节我们讲过,qemu 作为中间人其实挺累的,对上面的虚拟机需要模拟各种各样的外部设备。当虚拟机真的要使用物理资源的时候,对下面的物理机上的资源要进行请求,所以它的工作模式有点儿类似操作系统对接驱动。驱动要符合一定的格式,才能算操作系统的一个模块。同理,qemu 为了模拟各种各样的设备,也需要管理各种各样的模块,这些模块也需要符合一定的格式。
定义一个 qemu 模块会调用 type_init。例如,kvm 的模块要在 accel/kvm/kvm-all.c 文件里面实现。在这个文件里面,有一行下面的代码:
从代码里面的定义我们可以看出来,type_init 后面的参数是一个函数,调用 type_init 就相当于调用 module_init,在这里函数就是 kvm_type_init,类型就是 MODULE_INIT_QOM。是不是感觉和驱动有点儿像?
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入探讨了虚拟机设备模拟技术的实现原理,重点介绍了用户态的qemu和内核态的kvm如何协作来创建虚拟机,实现CPU和内存虚拟化。文章首先介绍了qemu的初始化模块机制,通过调用type_init函数注册模块,类似于操作系统对接驱动的模块管理。接着详细解释了模块的注册过程,包括type_init、module_init和register_module_init等函数的调用链,以及类似于Java反射机制的类和对象的动态定义过程。文章还介绍了QEMU Object Model(QOM)的面向对象反射机制,用C语言实现了一套类似于Java的反射机制。通过对kvm模块的init函数进行分析,展示了类的注册和初始化过程,以及全局哈希表type_table的使用。此外,文章还解析了qemu的命令行参数,包括启用硬件辅助虚拟化、虚拟机名称、计算机体系结构、CPU设置、内存、SMP、系统时间、显示器、网卡和硬盘等参数。总体来说,本文通过深入分析qemu和kvm的协作机制,为读者提供了深入了解虚拟化技术的机制和原理的视角。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》,新⼈⾸单¥68
《趣谈 Linux 操作系统》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(10)
- 最新
- 精选
- 大王叫我来巡山感觉设计这个软件的真厉害,怪不得我们自己做的业务系统自己都信不过,差距实在是太远,国内很多大公司在分享技术的时候也就是个PPT,根本不敢把代码放出来给大家看,也没有把实际用的效果展示给大家,只是给别人的感觉很牛逼而已。我感觉我从事这个工作这么久,真没遇到过这种大神
作者回复: 是的,绝对牛
2019-07-2227 - 佳俊看了很久都没有搞明白一个type_init 宏定义出来的函数是怎么被调用的,直到发现在module_init 里面一个这个属性的定义__attribute__((constructor)),才明白是GNU C 里面的一个特性,在main函数调用前系统会自动先调用这个函数。
作者回复: 是的
2020-05-288 - 泡泡请问代码是用的哪个内核版本
作者回复: 4.13
2019-07-2221 - why解析 qemu 的执行步骤 1. 初始化所有模块 模块的信息(包括名称, 模块类型初始化函数等), 存在 TypeInfo 中, 通过调用 type_init, 将这些信息统一以 ModelEntry 的格式存储到 ModelTypeList 中. module_call_init() 会调用 ModelTypeList 中所有模块的初始化函数, 从 ModelEntry 里存储的 TypeInfo 信息生成 TypeImpl(类似于 class 文件), 这个 TypeImpl 会存储到 qemu 的一个全局 hash 表中. 2. 解析命令行参数 命令行参数比较多. 其中 -machine 参数用于指定计算机体系结构. 另外 网卡/硬盘的配置要分表从 Host/Guest 较多进行设置. 3. 初始化 machine 会在 qemu 的全局 hash 表中注册对应计算机体系结构的 TypeImpl 信息. 然后会调用所有 TypeImpl 的初始化方法 class_init 生成对应的 Class. 最后会得到一个 MachineClass. 然后调用 TypeImple 中的 instance_init 方法生成 MachineClass 的一个实例.2020-02-2412
- 石维康请问老师pc_machine_type_##suffix所对应的TypeImpl的instance_init是在哪初始化的?也就是从代码里如何体现从MachineClass生成MachineState?2019-07-233
- 柒城老师,之后会不会开个专门讲虚拟化的专栏啊?吧QEMU和KVM好好讲讲2021-10-152
- robin期望老师出一个讲openstack的专栏2021-09-012
- robinopenstack是调用libvirt,libevirtd再调用kvm吗?2021-09-011
- kkxuenova通过libvirt驱动,将配置数据转化成XML格式的文件,用于创建虚拟机。2022-04-26
- 奔跑的码仔请问,qemu使用的是哪个版本?2019-10-23
收起评论