QEMU提供了一套面向对象编程的模型——QOM,即QEMU Object Module,几乎所有的设备如CPU、内存、总线等都是利用这一面向对象的模型来实现的。QOM模型的实现代码位于qom/文件夹下的文件中。对于开发者而言,只要知道如何利用QOM模型创建类和对象就可以了,但是开发者只有理解了QOM的相关数据结构,才能清楚如何利用QOM模型。因此本文先对QOM的必要性展开叙述,然后说明QOM的相关
接上一篇文章中介绍的qom的基本用法和qom面向对象实现原理,这一篇讲一下qom实现的源码1.初始化函数的注册类型注册的调用接口是type_init(xxx_register_types),type_init是个宏定义,最终原理是gcc 的constructor属性,添加这个属性描述的函数为初始化函数,会在main函数执行之前执行,最后宏定义的作用就是在xxx_register_types 之前加
转载 2024-09-24 10:45:00
184阅读
QEMU的对象管理是很重要的一个部分,linux中一切皆文件,而qemu中虚拟的一切实体皆Object,不管是CPU、设备还是KVM的使用都离不开QOM框架(Qemu Object Module)。本文对QOM设备管理机制做简单清晰的介绍,会以VIRTIO设备举例说明,方便更好的理解。一、ObjectClass和Object数据结构QOM采用了C++里面向对象的命令方式,每一类对象会实例化一个Ob
转载 2024-01-19 22:38:56
83阅读
1.qemu中的qom作为一个应用层开发的人来说,qemu的qom面向对象的实现有点奇奇怪怪,它有别于常规语言java、c++、c#的实现机制,也不同于javascript那种原型链的实现方式,也不同于lua那种hash表的实现方式。第一次看qom我也很难理解。首先面向对象有两个基本概念: 1.类(class) 2.实例(instance) 类是对象的类型、实例是类初始化后的对象。用惯了面向对象语
基本介绍        本文直接从VirtIO开始分析,在前期需要一些基础只是特别是Qemu的QOM对象模型,有很多其他的技术文档都分析的很好。VirtIONETPCI设备同样遵循QOM模型。VirtIONetPCI是一个半虚拟化的网卡设备,在guest os中存在virtio网络驱动对其进行操作,在qemu中的Vir
转载 2024-04-24 08:39:07
101阅读
qemu中创建设备的接口为qdev_new函数。 DeviceState *qdev_new(const char *name) { if (!object_class_by_name(name)) { module_load_qom_one(name); } return DEVICE(object_new(name)); } 当创建设备时,qemu首先根据名字找到其所对应的对象类
目录概述QOMQM.1 Class & ObjectQM.2 初始化QM.3 PropertyQM.4 QOM ListOptionsMemoryMM.1 Memory RegionMM.1.1 Listeners MM.2 Memoy BackendMM.2.1 AllocMM.2.2 numa bindMM.2.3 preallocMM.3 Memory
转载 2024-03-12 21:33:24
834阅读
初始化的难题QEMU中包含了大量的初始化函数,比如使用QOM模型设计的很多类(CPU、设备等都是利用QOM模型设计实现模拟的),这些类需要注册到管理类型的全局的hash表中,这个注册的过程需要在初始化函数中完成。想象一下,如果我们把这些注册过程都放到main函数里面调用,main函数中就会有非常长的一段篇幅,仅仅是用于调用大量的初始化函数,这样对于QEMU的代码维护非常不利,因此QEMU将这些初始
qemu面向对象的模型:QOMqemu用结构体实现了一套面向对象的机制,用于实现类和对象的概念,也实现了面向对象的封装、继承、多态。大部分设备模拟代码都会基于这个qom模型。相关数据结构:类定义:struct ObjectClass { /*< private >*/ Type type; /* typedef struct TypeImpl *Type */
qemu启动时,如果配置了相应virtio设备,会对guest的pci总线,virtio设备等进行模拟,先来看看qemu的设备模拟,那i8254/PIT为例(PIT的硬件规范略过,有兴趣的话可以参考 http://wiki.osdev.org/Programmable_Interval_Timer)hw/timer/i8254.c定义了PIT设备的模拟,通过qom来定义设备对象模型,e.
ubuntu12.04下使用android emulator,启用kvm加速,模拟i8259中断控制器的代码比较旧,对应于qemu0.14或者之前的版本,这时还没有QOM(qemu object model)模型,虚拟设备的代码是比较简单的。玩虚拟设备之前,首先得搞明白真实设备怎么玩:http://www.360doc.com/content/09/1017/08/128139_7395798.s
本节首先分析Qemu的初始化top level流程;从而引出Qemu各大功能模块的描述。最后分析Qemu与内核态KVM的通讯接口。1.1.1Main的主流程main– (vl.c function main) a) module_call_init(MODULE_INIT_QOM);--设备驱动初始化和注册 type_init(x86_cpu_register_types)(tar
转载 2024-05-22 09:21:51
205阅读
本节首先分析Qemu的初始化top level流程;从而引出Qemu各大功能模块的描述。最后分析Qemu与内核态KVM的通讯接口。1.1.1Main的主流程main– (vl.c function main) a) module_call_init(MODULE_INIT_QOM);--设备驱动初始化和注册 type_init(x86_cpu_register_types)(tar
转载 2月前
364阅读
文章目录一、前言二、源码编译(一)安装Msys2(二)配置GCC工具链(三)安装QEMU构建依赖(四)下载编译QEMU源码二、QUME编程基础(一)QOM机制(二)将 TypeInfo 注册 TypeImpl(三)测试(四)从结果中的反思参考资料 一、前言笔者这篇博客作为平时学习时的笔记记录,如有不对还望指正,本博客大量借鉴资料,笔者只是拾人牙慧的小屁孩。 QEMU是一种通用的开源计算机仿真器和
转载 2024-08-28 13:52:03
1505阅读
1点赞
ubuntu12.04下使用android emulator,启用kvm加速,模拟i8254定时器的代码比较旧,对应于qemu0.14或者之前的版本,这时还没有QOM(qemu object model)模型,虚拟设备的代码是比较简单的。玩虚拟设备之前,首先得搞明白真实设备怎么玩,有篇文档:,看不太明白就再看看计组和哈工大出版的C语言测控,以前上课用的这个。8254使用的端口时0x40~0x43,