接前一篇文章:QEMU源码全解析11 —— 定义一个QEMU模块(3)
本文内容参考:
《趣谈Linux操作系统》 —— 刘超,极客时间
《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社
特此致谢!
前几回围绕type_init函数进行了深入解析,最后由type_register_internal函数引出了一个概念:QOM。本文对其进行详细介绍。
上一回已提到,QOM的全称是QEMU Object Model。顾名思义,这是QEMU对象的一个抽象层。一般来讲,对象是C++、Java这类面向对象编程语言中的概念。面向对象的思想包括封装、继承和多态,这些思想在大型项目中能够更好地对程序进行组织与设计。Linux内核与QEMU虽然都是C语言的项目,但是实际上从代码中可以看出来,都充满了面向对象的思想。QEMU中体现这一思想的就是QOM。
QEMU的代码中充满了对象,特别是设备模拟,如网卡、显卡、声卡、串口等都是通过对象来抽象的。QOM用C语言基本上实现了继承、封装、多态特点。例如,网卡是一个类,其父类是一个PCI设备类,而此PCI设备类的父类是设备类,此即继承。QEMU通过QOM,可以对其(指QEMU)中的各种资源进行抽象、管理(如设备模拟中的设备创建、配置、销毁)。QOM还用于各种后端组件(如MemoryRegion、Machine等)的抽象。毫不夸张地说,QOM遍布于QEMU代码。
要理解QOM,首先需要理解类型和对象的区别。类型表示种类,对象表示该种类中一个具体的对象。比如,QEMU命令行中指定“-device edu,id-edu1, -device edu,id=edu2”,edu本身是一个种类(也可以说是一个类),而edu1和edu2是所创建的该类的两个对象。QOM整个运作包括三个部分,即类型的注册、类型的初始化和对象的初始化。三个部分涉及的函数如图所示:
类型的注册就是前几篇文章中讲到的那些函数,余下的部分后文书会逐一讲到。
对于QOM涉及的各个方面的深入细致的解析,请看下(几)回。