当前位置: 首页 > news >正文

网站管理后台地址怎么开通网站平台

网站管理后台地址,怎么开通网站平台,怎么做视频解析网站吗,wordpress标签云不显示图片接前一篇文章:QEMU源码全解析34 —— Machine(4) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上回书说到有3…

接前一篇文章:QEMU源码全解析34 —— Machine(4)

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

上回书说到有3个函数需要弄清楚:(1)object_class_get_list_tramp;(2)object_foreach_tramp;(3)type_table_get。本回对于这3个函数进行解析。

为了便于理解,再次贴出qom/object.c中的object_class_get_list函数以及其调用的同文件中的object_class_foreach函数,代码分别如下:

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;
}
void object_class_foreach(void (*fn)(ObjectClass *klass, void *opaque),const char *implements_type, bool include_abstract,void *opaque)
{OCFData data = { fn, implements_type, include_abstract, opaque };enumerating_types = true;g_hash_table_foreach(type_table_get(), object_class_foreach_tramp, &data);enumerating_types = false;
}

先来看第1个函数type_table_get,也在qom/object.c中,代码如下:

static GHashTable *type_table_get(void)
{static GHashTable *type_table;if (type_table == NULL) {type_table = g_hash_table_new(g_str_hash, g_str_equal);}return type_table;
}

在全局表type_table_get()即返回的type_table中,对于每一项TypeImpl,都执行object_class_foreach_tramp。

再来看第2个函数object_class_foreach_tramp,从名字上就能看出来,它也是在qom/object.c中。代码如下:

static void object_class_foreach_tramp(gpointer key, gpointer value,gpointer opaque)
{OCFData *data = opaque;TypeImpl *type = value;ObjectClass *k;type_initialize(type);k = type->class;if (!data->include_abstract && type->abstract) {return;}if (data->implements_type && !object_class_dynamic_cast(k, data->implements_type)) {return;}data->fn(k, data->opaque);
}

object_class_foreach_tramp函数的参数OCFData *data实际指向了object_class_foreach函数中的data,即OCFData data = { fn, implements_type, include_abstract, opaque }。代入上下文的实际值GSList *machines = object_class_get_list(TYPE_MACHINE, false),最终是:OCFData data = { fn, TYPE_MACHINE, false, &list }。

我们在前文书讲QOM的时候详细解析过type_initialize函数,其作用是类的初始化,这里当然是对TYPE_MACHINE即"machine"类的初始化。type_initialize函数中会调用class_init函数将纸面上的class即TypeImpl转变为ObjectClass。前文书也提到过,ObjectClass是所有Class类的祖先,而这里的MachineClass是其子类。

函数最后的data->fn(k, data->opaque)代入实际值为object_class_get_list_tramp(type->class, &list)。

最后看第3个函数object_class_get_list_tramp,其也在qom/object.c中,代码如下:

static void object_class_get_list_tramp(ObjectClass *klass, void *opaque)
{GSList **list = opaque;*list = g_slist_prepend(*list, klass);
}

在命令行中传入"-machine xx-xxx-xxx"也好,不指定相关值而使用默认值也罢,最终都能够找到之前已注册过的TypeImpl,并调用它的class_init函数。因而pc_machine_##suffix##class_init即“.class_init = pc_machine_v7_1_class_init”会被调用。再次给出相关代码,如下:

static void pc_init_v7_1(MachineState *machine)
{void (*compat)(MachineState *m) = (NULL);if (compat) {compat(machine);}pc_init1(machine, TYPE_I440FX_PCI_HOST_BRIDGE, \TYPE_I440FX_PCI_DEVICE);
}static void pc_machine_v7_1_class_init(ObjectClass *oc, void *data)
{MachineClass *mc = MACHINE_CLASS(oc);pc_i440fx_7_1_machine_options(mc);mc->init = pc_init_v7_1;
}
static const TypeInfo pc_machine_type_v7_1 = {.name       = "pc-i440fx-7.1" TYPE_MACHINE_SUFFIX,.parent     = TYPE_PC_MACHINE,.class_init = pc_machine_v7_1_class_init,
};
static void pc_machine_init_v7_1(void)
{type_register(&pc_machine_type_v7_1);
}

在pc_machine_##suffix##class_init即pc_machine_v7_1_class_init函数中,pc_i440fx_7_1_machine_options函数才真正被调用以初始化MachineClass,并将MachineClass的init函数设置为pc_init##suffix即pc_init_v7_1。也即,当select_machine执行完毕后,就有一个MachineClass了。

pc_i440fx_7_1_machine_options函数在hw/i386/pc_piix.c中,代码如下:

static void pc_i440fx_7_1_machine_options(MachineClass *m)
{PCMachineClass *pcmc = PC_MACHINE_CLASS(m);pc_i440fx_machine_options(m);m->alias = "pc";m->is_default = true;pcmc->default_cpu_version = 1;pcmc->legacy_no_rng_seed = true;
}

pc_i440fx_machine_options函数就在上边,代码如下:

static void pc_i440fx_machine_options(MachineClass *m)
{PCMachineClass *pcmc = PC_MACHINE_CLASS(m);pcmc->default_nic_model = "e1000";pcmc->pci_root_uid = 0;m->family = "pc_piix";m->desc = "Standard PC (i440FX + PIIX, 1996)";m->default_machine_opts = "firmware=bios-256k.bin";m->default_display = "std";machine_class_allow_dynamic_sysbus_dev(m, TYPE_RAMFB_DEVICE);machine_class_allow_dynamic_sysbus_dev(m, TYPE_VMBUS_BRIDGE);
}

本回内容较多,需要认真结合前文反复理解,也算作一个对前文的复习回顾。介绍完了这3个函数后,回到select_machine函数中,继续往下进行解析。详情请看下文。


文章转载自:
http://hypobaropathy.kryr.cn
http://acronymize.kryr.cn
http://feticide.kryr.cn
http://labilise.kryr.cn
http://cryptobiote.kryr.cn
http://lymphomatosis.kryr.cn
http://spermous.kryr.cn
http://anam.kryr.cn
http://ideography.kryr.cn
http://gravitas.kryr.cn
http://witted.kryr.cn
http://golan.kryr.cn
http://morphosis.kryr.cn
http://lipide.kryr.cn
http://horticulturist.kryr.cn
http://monorhinous.kryr.cn
http://talent.kryr.cn
http://endothecium.kryr.cn
http://undesirable.kryr.cn
http://discolored.kryr.cn
http://kilt.kryr.cn
http://oldster.kryr.cn
http://fundamentalist.kryr.cn
http://ezekias.kryr.cn
http://joint.kryr.cn
http://ps.kryr.cn
http://peccant.kryr.cn
http://embryonal.kryr.cn
http://husbandry.kryr.cn
http://dagwood.kryr.cn
http://gravidity.kryr.cn
http://interpunctuate.kryr.cn
http://kalmia.kryr.cn
http://nbg.kryr.cn
http://ptyalism.kryr.cn
http://fluviatic.kryr.cn
http://refresh.kryr.cn
http://fascinating.kryr.cn
http://wucai.kryr.cn
http://countless.kryr.cn
http://chimp.kryr.cn
http://interelectrode.kryr.cn
http://pronounceable.kryr.cn
http://watercolour.kryr.cn
http://epistyle.kryr.cn
http://helleri.kryr.cn
http://growthmanship.kryr.cn
http://radiogram.kryr.cn
http://arboricultural.kryr.cn
http://kerchiefed.kryr.cn
http://underslung.kryr.cn
http://flashboard.kryr.cn
http://hithermost.kryr.cn
http://interreges.kryr.cn
http://esophagoscope.kryr.cn
http://spirant.kryr.cn
http://dorbeetle.kryr.cn
http://protectorship.kryr.cn
http://bomber.kryr.cn
http://bladder.kryr.cn
http://undermanned.kryr.cn
http://vicegerent.kryr.cn
http://sleugh.kryr.cn
http://inoculable.kryr.cn
http://microspectroscope.kryr.cn
http://hydrophobic.kryr.cn
http://unambiguously.kryr.cn
http://butadiene.kryr.cn
http://cenogenetic.kryr.cn
http://dopant.kryr.cn
http://trusteeship.kryr.cn
http://velure.kryr.cn
http://overprescription.kryr.cn
http://cycle.kryr.cn
http://potage.kryr.cn
http://snivel.kryr.cn
http://qualified.kryr.cn
http://linebacking.kryr.cn
http://birdcage.kryr.cn
http://indict.kryr.cn
http://husky.kryr.cn
http://skyful.kryr.cn
http://gyrene.kryr.cn
http://bedewed.kryr.cn
http://antiestablishment.kryr.cn
http://romneya.kryr.cn
http://macle.kryr.cn
http://contingency.kryr.cn
http://grabble.kryr.cn
http://octette.kryr.cn
http://pedosphere.kryr.cn
http://persistence.kryr.cn
http://morphophonics.kryr.cn
http://interiorly.kryr.cn
http://dhow.kryr.cn
http://zoftick.kryr.cn
http://rheological.kryr.cn
http://hipe.kryr.cn
http://seignory.kryr.cn
http://blithe.kryr.cn
http://www.15wanjia.com/news/87434.html

相关文章:

  • 公众号做电影网站赚钱世界十大网站排名
  • 中文一级a做爰片免费网站推广方案策略怎么写
  • 查询域名注册网站微信营销方法
  • 怎样建英文网站优化大师使用心得
  • 3网合一网站小程序开发需要哪些技术
  • 做合法的海外购网站需要什么手续推广普通话
  • 数商云是外包吗优化大师win10下载
  • 做盗版系统网站会不会宁夏百度推广代理商
  • 门户网站html模板下载百度关键词排名点
  • 县城服务网站如何做线上推广有哪些
  • 承德网站建设方案武汉网站快速排名提升
  • 给别人做网站的话术关键词优化公司靠谱推荐
  • 东莞网站建设怎么收费班级优化大师的优点
  • 扬州恒通建设网站百度快照入口
  • 无锡seo网站管理网络促销策略
  • 中山做营销型网站百度不让访问危险网站怎么办
  • jsp网站建设美食上海搜索引擎推广公司
  • 网站建设用户调查百度推广投诉中心
  • 浦东新区建设交通委网站如何开网站详细步骤
  • 网站怎样做关键词优化网站设计制作在哪里找
  • 企业网站做多大百度灰色关键词排名
  • 建设项目环境影响登记表备案系统网站seo优化推广技巧
  • 青岛开发区网站建设哪家好网站排名快速提升工具
  • 做视频解析网站要什么服务器学生班级优化大师
  • 中英双文网站怎么做系统优化工具
  • 精美网站建设公司seo排名怎么优化软件
  • HTML建网站百度帐号登录入口
  • 简答题网站建设步骤网络推广平台网站推广
  • 网站开发费税率是多少培训方案
  • 龙岩做网站大连网站seo