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

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

时间:2023-09-16 15:04:46浏览次数:43  
标签:Object obj Apple Qemu object init 源码 ti type

一,前言

本次主要分析object_new,也就是了解最关键的object类对象。

二,源码分析

  1. 看上去就是通过TypeImpl来创建Object。
Object *object_new(const char *typename)
{
 TypeImpl *ti = type_get_by_name(typename);
 
 return object_new_with_type(ti);
}
  1. 主要调用初始化object,把type中的class先赋值给obj,obj->class = type->class。
void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
{
 Object *obj = data;
 
 g_assert(type != NULL);
 type_initialize(type);
 
 g_assert_cmpint(type->instance_size, >=, sizeof(Object));
 g_assert(type->abstract == false);
 g_assert_cmpint(size, >=, type->instance_size);
 
 memset(obj, 0, type->instance_size);
 obj->class = type->class;
 object_ref(obj);
 obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal,
 NULL, object_property_free);
 object_init_with_type(obj, type);
 object_post_init_with_type(obj, type);
}
  1. 接着看object_init_with_type是一个归递,从父类开始调用instance_init函数
static void object_init_with_type(Object *obj, TypeImpl *ti)
{
 if (type_has_parent(ti)) {
 object_init_with_type(obj, type_get_parent(ti));
 }
 
 if (ti->instance_init) {
 ti->instance_init(obj);
 }
}
static void object_instance_init(Object *obj)
{
 object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
}
  1. 主要调用属性add函数,把ObjectProperty放入obj的GSLinst中

object_property_add(obj, name, "string",
 get ? property_get_str : NULL,
 set ? property_set_str : NULL,
 property_release_str,
 prop, &local_err);

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

父类全部归递完成,objectNew就算创建完成了。

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

5. 接着调用

#define MACHINE(obj) OBJECT_CHECK(MachineState, (obj), TYPE_MACHINE)

这种我的源码宏分析(2)已经说到过了,其实就是把obj的地址赋值给MachineState的第一个元素object指针。

6.再后来就是属性添加了。

至于属性加了有什么用,好像后面处理都是靠属性中的值来判断,但是暂时不清楚。

object_property_add_child(object_get_root(), "machine",OBJECT(current_machine), &error_abort);

分了2部分。一个object_get_root(),就是创建container容器的空节点。

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

object_property_add_child里面主要语句就是child->parent = obj;说明把容器指向父节点container。

三,总结

本节主要关注的是Object的内容如何来的,主要通过object_new函数来创建,也就是根据TypeImpl中的class内容来创建,而TypeIpml的class源码分析(2)中第一项就有描述,class赋值是在type_initialize中处理的,而且ti->class->type = ti,等于ObjectClass中还会引用到TypeImpl中的内容。Object的所有子类和父类属性都放在properties的哈希表中。Object的父类容器名称为container。

MachineClass的第一个元素ObjectClass类的,不是指针,所以可以理解为MachineClass继承了ObjectClass。而且父类是子类的第一个元素,典型用法是MachineClass *mc = MACHINE_CLASS(oc)。MachineState的结构体设计和使用思路雷同,用了#define MACHINE(obj)宏定义。

标签:Object,obj,Apple,Qemu,object,init,源码,ti,type
From: https://blog.51cto.com/u_16247275/7493755

相关文章

  • [SpringSecurity5.6.2源码分析十]:HeaderWriterFilter
    前言• 为了安全考虑,添加启用浏览器保护的某些头是很有用的,比如X-Frame-Options,X-XSS-Protection和X-Content-Type-Options• 而HeaderWriterFilter就支持往响应头写入各种响应头1、HeadersConfigurer• HeadersConfigurer是HeaderWriterFilter对应的配置类,是在获取HttpSecur......
  • springboot vue uniapp 小说电子书阅读小程序APP源码
    开发环境及工具:大等于jdk1.8,大于mysql5.5,idea(eclipse),nodejs,vscode(webstorm),HBuilderX技术说明:springbootmybatisvueelementuiuniapp代码注释齐全,没有多余代码,适合学习(毕设),二次开发,包含论文技术相关文档。功能介绍:用户端:登录注册首页显示搜索小说,轮播图,最新发布小说(可带推荐算......
  • 【DSP视频教程】DSP视频教程第12期:TI开源分享IQmath DSP源码,适用于所有Cortex-M内核,本
     今年TI推出MSPM0系列产品配套的SDK软件包里面将此库开源了,之前的时候也移植过IQmatb,不过只有库版本,这次竟然开源了,确实是不可多得的好资源。这个是定点库,非常适合用于M0,  M0+,  M3和不带硬件FPU的M4内核上,当然,用在M4F,M7,M33等器件上也是没问题的。本次视频配套的例子将ARMDS......
  • 阅读源码主题学习(I)
    一个程序员的技术水平的高低,是看他做过多少系统,更重要是看他踩过多少坑。阅读源码有哪些坑?源码阅读最难的不是代码本身,也不是理解其设计理念,而是坚持!职场小人开始说话了:1.工作中用的技术不需要阅读源码,在开发过程中熟练运用就行;2.看源码太费时间,而且容易忘记,实际使用中遇到问......
  • 二、 Axios入门—Axios源码分析
    一、axios与Axios的关系从语法上来说:axios不是Axios的实例从功能上来说:axios是Axios的实例axios是Axios.prototype.request函数bind()返回的函数axios作为对象有Axios原型对象上的所有方法,有Axios对象上所有属性二、instance与axios的区别相同:(1)都是一......
  • 基于Javaweb的物业管理系统的设计与实现-计算机毕业设计源码+LW文档
    摘 要随着目前信息化手段的进步,使用技术手段可以有效的对小区物业进行管理。在社区,人员多,各种维修、报修信息大,如果单靠人工进行管理,很难进行有效的统计。为此提出开发物业管理系统,来管理小区的业主信息、通知公告、报修管理、房产管理等。本物业管理系统可以降低社区工作者的劳......
  • 基于Javaweb汽车销售管理系统设计与实现-计算机毕业设计源码+LW文档
    摘 要随着因特网技术的迅速发展,当前人们的生活模式发生了巨大的变化。特别是在经济发展的影响下,汽车销售逐渐进入了人们的生活,并通过汽车销售系统进行汽车管理,方便用户在线销售、交流操作。当前城市生活节奏快,工作路程远,为了减少不必要的路途时间,许多用户选择使用自驾快速到达目......
  • 《Python从入门到实战》-源码篇-pyspider
    pyspider是什么?PySpider是一个开源的网络爬虫框架,使用Python语言编写。高效、易用、可扩展等特点,可以帮助用户快速地开发出高效的网络爬虫程序。PySpider支持多线程、分布式、异步IO等技术,可以处理大规模的数据爬取任务。同时,PySpider还提供了Web界面,方便用户进行任务管理和监控......
  • Vue源码学习(五):<templete>渲染第四步,生成虚拟dom并将其转换为真实dom
    好家伙, 前情提要:在上一篇我们已经成功将ast语法树转换为渲染函数 现在我们继续 1.项目目录代码已开源https://github.com/Fattiger4399/analytic-vue.git手动调试一遍,胜过我解释给你听一万遍新增文件:vnode/index.js  vnode/patch.js  lifecycle.js 2.虚......
  • mac版本Spring5.0源码环境搭建
    下载spring5.0版本代码链接是:https://github.com/spring-projects/spring-framework.git装gradle,使用的版本是8.3版本链接是:https://gradle.org/next-steps/?version=8.3&format=bin有错误提示:/Users/wangyu/work/code/spring-framework/buildSrc/src/main/java/org/springfra......