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

开发网站需求设计推广技巧

开发网站需求设计,推广技巧,可以免费做推广的网站,怀宁县住房和建设局网站接前一篇文章:QEMU源码全解析33 —— Machine(3) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 上一回围绕DEF…

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

本文内容参考:

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

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

特此致谢!

上一回围绕DEFINE_I440FX_MACHINE宏进行了详细解析,本回讲一下QEMU初始化中与有machine关的部分。

在QEMU老版本中,主函数main中会调用select_machine函数,新版本中放到了main() -> qemu_main() -> qemu_init() -> qemu_create_machine -> select_machine()。

我们从qemu_create_machine函数开始看起。qemu_create_machine函数在softmmu/vl.c中,代码如下:

static void qemu_create_machine(QDict *qdict)
{MachineClass *machine_class = select_machine(qdict, &error_fatal);object_set_machine_compat_props(machine_class->compat_props);current_machine = MACHINE(object_new_with_class(OBJECT_CLASS(machine_class)));object_property_add_child(object_get_root(), "machine",OBJECT(current_machine));object_property_add_child(container_get(OBJECT(current_machine),"/unattached"),"sysbus", OBJECT(sysbus_get_default()));if (machine_class->minimum_page_bits) {if (!set_preferred_target_page_bits(machine_class->minimum_page_bits)) {/* This would be a board error: specifying a minimum smaller than* a target's compile-time fixed setting.*/g_assert_not_reached();}}cpu_exec_init_all();page_size_init();if (machine_class->hw_version) {qemu_set_hw_version(machine_class->hw_version);}/** Get the default machine options from the machine if it is not already* specified either by the configuration file or by the command line.*/if (machine_class->default_machine_opts) {QDict *default_opts =keyval_parse(machine_class->default_machine_opts, NULL, NULL,&error_abort);qemu_apply_legacy_machine_options(default_opts);object_set_properties_from_keyval(OBJECT(current_machine), default_opts,false, &error_abort);qobject_unref(default_opts);}
}static int global_init_func(void *opaque, QemuOpts *opts, Error **errp)
{GlobalProperty *g;g = g_malloc0(sizeof(*g));g->driver   = qemu_opt_get(opts, "driver");g->property = qemu_opt_get(opts, "property");g->value    = qemu_opt_get(opts, "value");qdev_prop_register_global(g);return 0;
}

其中第1行代码就是select_machine函数,代码片段如下:

MachineClass *machine_class = select_machine(qdict, &error_fatal);

顾名思义,select_machine函数的作用是选择一个MachineClass,其可能由用户指定,如果用户未指定,则采用系统默认。如果是后者,QEMU最新版本号对应的机器类型为默认设置。由于笔者的源码为qemu-7.1.0,因此默认机器类型是pc-i440fx-7.1-machine。

select_machine函数同样在softmmu/vl.c中,代码如下:

static MachineClass *select_machine(QDict *qdict, Error **errp)
{const char *optarg = qdict_get_try_str(qdict, "type");GSList *machines = object_class_get_list(TYPE_MACHINE, false);MachineClass *machine_class;Error *local_err = NULL;if (optarg) {machine_class = find_machine(optarg, machines);qdict_del(qdict, "type");if (!machine_class) {error_setg(&local_err, "unsupported machine type");}} else {machine_class = find_default_machine(machines);if (!machine_class) {error_setg(&local_err, "No machine specified, and there is no default");}}g_slist_free(machines);if (local_err) {error_append_hint(&local_err, "Use -machine help to list supported machines\n");error_propagate(errp, local_err);}return machine_class;
}

如上面所讲,在select_machine函数中,有两种方式可以生成MachineClass:一种方式是调用find_machine函数,通过解析QEMU命令行参数生成MachineClass,即用户指定方式;另一种方式是通过find_default_machine函数找一个默认的MachineClass,即系统默认方式。后文会分别解析这两种方式的两个函数。

在此之前,有一个函数值得先深入研究:object_class_get_list。无论是用户指定还是系统默认方式,都得先调用object_class_get_list函数获得一个MachineClass列表,然后在里边找。代码片段如下:

 GSList *machines = object_class_get_list(TYPE_MACHINE, false);

object_class_get_list函数在qom/object.c中,代码如下:

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;
}

object_class_foreach函数在同文件中,代码如下:

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;
}

从object_class_foreach函数的参数中可以看出,第1个参数是一个函数指针,指向了传入的实参object_class_get_list_tramp。

现在有4个函数需要弄清楚:(1)object_class_get_list_tramp;(2)object_foreach_tramp;(3)type_table_get;(4)g_hash_table_foreach。

对于这4个函数的解析,请看下回。

http://www.khdw.cn/news/51330.html

相关文章:

  • 在线做免费网站有哪些专业制作网页的公司
  • 百度竞价排名收费标准电脑上突然出现windows优化大师
  • 台州做网站seo的微商软文大全
  • 网站qq临时会话怎么弄seo关键词优化是什么意思
  • wordpress图片云储存站内seo的技巧
  • 建网站哪家好北京网站展示型推广
  • 免费做简单网站大连seo优化
  • 聊城网站建设报价2024年8月爆发新的大流行病毒吗
  • 做网站哪家最好天津网站排名提升多少钱
  • 沈阳做网站优化哪家好网络平台推广有哪些渠道
  • 中国建设部网站首页域名流量查询工具
  • 手机网站 设置网络营销渠道可分为哪些
  • 百度排名 网站标题滨州seo招聘
  • 图片存放网站做链接苏州seo关键词优化软件
  • 有没有网站建设的教程自助建站平台源码
  • 网站建设制作视频淘宝关键词排名优化技巧
  • 特效做的很牛逼的网站seo外链在线工具
  • 网站服务合同用交印花税吗如何在百度打广告
  • wordpress 房产模板网站seo教程
  • 用织梦做的网站怎样看网站模板建站
  • 建站平台企业排名最能打动顾客的十句话
  • 外贸自建站是什么意思苏州seo网站推广哪家好
  • 南宁最高端网站建设百度平台电话
  • 做英语题的网站人工在线客服系统
  • 自己做的网站怎么爬数据库搜索引擎国外
  • 网上装修公司网站策划书网站友情链接怎么弄
  • 搭建公司介绍网站世界十大网站排名出炉
  • 学校网站建设可行性分析100个成功营销案例
  • 企业做网站营销百度明星人气榜入口
  • 中原郑州网站建设代写文章兼职