首页 > 编程语言 >Qemu源码分析(2)—Apple的学习笔记

Qemu源码分析(2)—Apple的学习笔记

时间:2023-09-15 17:05:16浏览次数:38  
标签:el Apple mc Qemu 源码 temp MachineClass type class

一,前言

最近从main开始看了opt参数相关的解析,这个比较简单我就不写了,然后当时我搞不清楚的是MachineClass和TypeImpl类的关系。本节主要分析的其实就是分析machine_class怎么来的,其实也就是machine_class = select_machine();

二, 源码分析


  1. 关于mc的来历type_initialize中ti->class->type = ti;
    另外一个特点是MachineClass的第一个地址内容是ObjectClass,之后会用上。

Qemu源码分析(2)—Apple的学习笔记_qemu

  1. 利用非NULL进行归递搜索的方法通过归递来搜索父类
static bool type_is_ancestor(TypeImpl *type, TypeImpl *target_type)
{
 assert(target_type);
 
 /* Check if target_type is a direct ancestor of type */
 while (type) {
 if (type == target_type) {
 return true;
 }
 
 type = type_get_parent(type);
 }
 
 return false;
}

一层层读取父类

static TypeImpl *type_get_parent(TypeImpl *type)
{
 if (!type->parent_type && type->parent) {
 type->parent_type = type_get_by_name(type->parent);
 g_assert(type->parent_type != NULL);
 }
 
 return type->parent_type;
}

在ObjectClass *object_class_dynamic_cast(ObjectClass *class,const char *typename)函数中 type = class->type;

if (type->name == typename) {
 return class;
 }

通过type值对比找typeImpl实体。感觉设计的不太直接,先找class,然后class又指向typeImpl。直接对比2个typeImpl不好吗?可能为了函数复用吧,所以打包了这个函数。
若不是直接为machine那么就搜索其父类TypeImpl。如item2的代码就是搜索父类。

  1. 继续说find_default_machine函数。
MachineClass *find_default_machine(void)
{
GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
。。。
}

object_class_get_list会返回GSList类型

GSList *object_class_get_list(const char *implements_type,
 bool include_abstract)
{
 GSList *list = NULL;

 object_class_foreach(object_class_get_list_tramp,
 implements_type, include_abstract, &list);
 return list;
}

所以只要查data->opaque什么时候赋值的,就是GSList的值了。

Qemu源码分析(2)—Apple的学习笔记_qemu_02

进入这个fn,其实就是为GLlist中的data赋值为这个找到的class

Qemu源码分析(2)—Apple的学习笔记_qemu_03

G_slist_prepend是在链表头追加内容,通过归递又找到了一个父类是machine的,所以也加入了链表中

Qemu源码分析(2)—Apple的学习笔记_qemu_04

  1. 关于MachineClass

objectClassMachineClass *mc = MACHINE_CLASS(oc);
关于mc地址和oc首地址成员一样,但是里面其它值什么时候赋值的呢!原来type_init归递的时候都赋值了。

Qemu源码分析(2)—Apple的学习笔记_qemu_05

所以如下el->data虽然是一个objectclass,但是也是一个MachineClass,因为首地址一样。但是由于temp->is_default=0所以最终返回的mc是NULL。

MachineClass *find_default_machine(void)
{
 GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
 MachineClass *mc = NULL;
 
 for (el = machines; el; el = el->next) {
 MachineClass *temp = el->data;
 
 if (temp->is_default) {
 mc = temp;
 break;
 }
 }
 
 g_slist_free(machines);
 return mc;
}

最后根据boardName找到了mc。如下函数的写法和之前分析的根据is_default的查找方法雷同。只是在GSList中对比的是name而已。

static MachineClass *find_machine(const char *name)
{
 GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
 MachineClass *mc = NULL;

 for (el = machines; el; el = el->next) {
 MachineClass *temp = el->data;

 if (!strcmp(temp->name, name)) {
 mc = temp;
 break;
 }
 if (temp->alias &&
 !strcmp(temp->alias, name)) {
 mc = temp;
 break;
 }
 }

 g_slist_free(machines);
 return mc;
}

三,小结

所以主要内容就是TypeImpl关联到了ObjectClass,而MachineClass中包含ObjectClass,然后就联系起来了。有时候想想c代码设计的核心就是数据结构+算法,而这里所谓的算法就是递归搜索判断而已。不同的数据结构就要搭配不同的算法了,这里就要考虑怎么样的数据结构才是最优化的。

标签:el,Apple,mc,Qemu,源码,temp,MachineClass,type,class
From: https://blog.51cto.com/u_16247275/7483657

相关文章

  • 用源码创建虚拟资源加密平台,扫码支付获取资源
    大家都知道,八图片是一个可以对图片或网址进行二维码加密的网络平台,很多人利用这个平台的加密功能,自动化的出售虚拟产品。你可以将任何资源或产品隐藏在加密地址的后面,让用户扫码支付后获取。这个网站不仅提供了加密的功能,还提供了一套简化版的源码,可以利用这个源码,搭建一个一模一......
  • 每日一练:无感刷新页面(附可运行的前后端源码,前端vue,后端node)
    1、前言想象下,你正常在网页上浏览页面。突然弹出一个窗口,告诉你登录失效,跳回了登录页面,让你重新登录。你是不是很恼火。这时候无感刷新的作用就体现出来了。2、方案2.1redis设置过期时间在最新的技术当中,token一般都是在Redis服务器存着,设置过期时间。只要在有效时间内,重新发......
  • 在线直播源码,AlarmManager定时器设置
    在线直播源码,AlarmManager定时器设置Android开发中一般常见的定时器有Timer、Handler。某些场景下也会使用到AlarmManager,相对于前面两者,AlarmManager功能更加多样,某些场景下有更准确的定时效果。 //Timer    Timertimer=newTimer();    TimerTaskt......
  • Spring源码分析(三)自动注入与精确注入
    上篇文章讲了1.4小节中关于依赖注入和方法注入的内容。这篇文章继续这节中的其他内容,顺便解决下上篇文章中留下的问题---注入模型前言:在看下面的内容之前,我们先对自动注入和精确注入有一个大概的了解,所谓精确注入就是指通过构造函数或setter方法指定了我们对象之间的依赖,也就是......
  • Vue源码学习(六):(支线)渲染函数中with(),call()的使用以及一些思考
    好家伙, 昨天,在学习vue源码的过程中,看到了这个玩意嘶,看不太懂,研究一下 1.上下文这段出现vue模板编译的虚拟node部分exportfunctionrenderMixin(Vue){Vue.prototype._c=function(){//创建标签returncreateElement(...arguments)......
  • 源码网
    优秀网站源码、编程源码下载网站大集中1.51源码2.源码之家:http://www.codejia.com/3.源码网:http://www.codepub.com/4.虾客源码:http://www.xkxz.com/5.多多源码6.洪越源代码:http://www.softhy.net/7.锋网源码:http://www.fwvv.net/8.代码爱好者:http://www.codefans.com/9.爱源码:http......
  • 基于python的医疗问诊服务数据采集及可视化分析系统-计算机毕业设计源码+LW文档
    选题的目的、理论与实践意义:选题的目的:随着“互联网+”概念的兴起,有很多传统行业获得了新的发展契机。根据数据统计,用户足不出户就能享受优质的医疗服务,看病贵和看病难这样的问题通过线上医疗问诊得到有效的缓解。系统通过对网站你用户及为平台提供服务的医生,医疗服务数据,评价信息......
  • 低代码开发平台 一款自定义软件开发平台源码
    低代码PaaS平台源码 采用对象方式实现字段、API的字段类型,引入RPA实现表自动化建模;再使用选择方式对地段功能进行选择定义甚至可以插入代码进行自定义。数字化转型的迫切需求随着数字科技的发展,各行各业对于新技术解决方案的需求也在逐日递增,非技术人员也开始被要求在短时间内构建......
  • 失物招领系统的设计与实现-计算机毕业设计源码+LW文档
    一、课题背景 随着互联网的飞速发展,学校也进入了信息化时代。校园中大学生丢失物品的现象较为普遍,虽然目前国内有一些网上校园寻物平台或者是QQ群之类的,但是都不是很成熟,使得失主不能及时甚至找不到失物,给生活带来了极大的不便。通过互联网为在校师生搭建一个发布信息的平台,可以......
  • 生鲜电商系统的设计与实现-计算机毕业设计源码+LW文档
    一、研究的背景意义随着计算机信息技术和网络化进程的发展,电子商务逐渐成熟,通过信息技术手段把传统的销售活动转移到网络中来,打破了地区之间的限制,使得企业或者个人都可以参与进来。电子商务是一场信息革命,改变了人们的思维,对生产、生活都产生了非常大的影响。网上销售凭借便捷的......