QEMU源码全解析25 —— QOM介绍(14)
接前一篇文章:QEMU源码全解析24 —— QOM介绍(13)
本文内容参考:
《趣谈Linux操作系统》 —— 刘超,极客时间
《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社
特此致谢!
本文开始对于属性ObjectProperty进行深入讲解。
ObjectProperty结构在include/qom/object.h中定义,代码如下:
typedef struct ObjectProperty ObjectProperty;……struct ObjectProperty
{char *name;char *type;char *description;ObjectPropertyAccessor *get;ObjectPropertyAccessor *set;ObjectPropertyResolve *resolve;ObjectPropertyRelease *release;ObjectPropertyInit *init;void *opaque;QObject *defval;
};
其中:
- name:表示名字;
- type:表示属性的类型。如有的属性是字符串,有的是bool类型,有的是link等其它更复杂的类型;
- description:表示对于属性的描述;
- get:对属性进行获取;
- set:对属性进行设置;
- resolve:对属性进行操作;
- release:对属性进行释放;
- opaque:指向一个具体的属性,如BoolProperty等。
每一种具体的属性都会有一个结构体来描述它。例如:表示布尔类型的属性的BoolProperty、表示字符串类型的属性的StringProperty以及表示link类型的属性的LinkProperty。三者都在qom/object.c中定义(不挨着),定义分别如下:
typedef struct {union {Object **targetp;Object *target; /* if OBJ_PROP_LINK_DIRECT, when holding the pointer */ptrdiff_t offset; /* if OBJ_PROP_LINK_CLASS */};void (*check)(const Object *, const char *, Object *, Error **);ObjectPropertyLinkFlags flags;
} LinkProperty;……typedef struct StringProperty
{char *(*get)(Object *, Error **);void (*set)(Object *, const char *, Error **);
} StringProperty;……typedef struct BoolProperty
{bool (*get)(Object *, Error **);void (*set)(Object *, bool, Error **);
} BoolProperty;
总结一下Object、ObjectProperty和各个具体属性的关系:
- Object(struct object)-> GHashTable *properties中存放着属性名到ObjectProperty(struct ObjectProperty)的映射。
- ObjectProperty -> void *opaque指向一个具体的属性。
下边介绍几个属性的操作接口。属性的添加分为类属性的添加和对象属性的添加。
对于对象属性来说,其属性添加是通过object_property_add接口完成的。object_property_add函数在qom/object.c中,代码如下:
ObjectProperty *
object_property_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque)
{return object_property_try_add(obj, name, type, get, set, release,opaque, &error_abort);
}
该函数实际上是object_property_try_add函数的简单封装,object_property_try_add函数就在上边,代码如下:
ObjectProperty *
object_property_try_add(Object *obj, const char *name, const char *type,ObjectPropertyAccessor *get,ObjectPropertyAccessor *set,ObjectPropertyRelease *release,void *opaque, Error **errp)
{ObjectProperty *prop;size_t name_len = strlen(name);if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) {int i;ObjectProperty *ret = NULL;char *name_no_array = g_strdup(name);name_no_array[name_len - 3] = '\0';for (i = 0; i < INT16_MAX; ++i) {char *full_name = g_strdup_printf("%s[%d]", name_no_array, i);ret = object_property_try_add(obj, full_name, type, get, set,release, opaque, NULL);g_free(full_name);if (ret) {break;}}g_free(name_no_array);assert(ret);return ret;}if (object_property_find(obj, name) != NULL) {error_setg(errp, "attempt to add duplicate property '%s' to object (type '%s')",name, object_get_typename(obj));return NULL;}prop = g_malloc0(sizeof(*prop));prop->name = g_strdup(name);prop->type = g_strdup(type);prop->get = get;prop->set = set;prop->release = release;prop->opaque = opaque;g_hash_table_insert(obj->properties, prop->name, prop);return prop;
}
先不管通配符的情况,即if (name_len >= 3 && !memcmp(name + name_len - 3, "[*]", 4)) 条件判断中的内容,直接跳过往下看。首先调用object_property_find函数来确认所插入的属性是否已经存在。如果已存在,则报错返回,确保不会添加重复的属性。
随后分配一个ObjectProperty结构并使用函数参数进行初始化。代码片段如下:
prop = g_malloc0(sizeof(*prop));prop->name = g_strdup(name);prop->type = g_strdup(type);prop->get = get;prop->set = set;prop->release = release;prop->opaque = opaque;
最后,调用以下代码将其插入到对象的properties域中,并返回此prop:
g_hash_table_insert(obj->properties, prop->name, prop);
返回头来,看一下object_property_find函数的具体实现。object_property_find函数在同文件(qom/object.c)中,代码如下:
ObjectProperty *object_property_find(Object *obj, const char *name)
{ObjectProperty *prop;ObjectClass *klass = object_get_class(obj);prop = object_class_property_find(klass, name);if (prop) {return prop;}return g_hash_table_lookup(obj->properties, name);
}
此函数首先调用object_get_class函数由Object结构对象(的指针)obj得到ObjectClass对象(的指针)kclass。object_get_class函数在qom/object.c中,代码如下:
ObjectClass *object_get_class(Object *obj)
{return obj->class;
}
然后,调用object_class_property_find函数以确认自己所属的类以及所有父类都不存在这个属性。object_class_property_find函数同样在qom/object.c中,代码如下:
ObjectProperty *object_class_property_find(ObjectClass *klass, const char *name)
{ObjectClass *parent_klass;parent_klass = object_class_get_parent(klass);if (parent_klass) {ObjectProperty *prop =object_class_property_find(parent_klass, name);if (prop) {return prop;}}return g_hash_table_lookup(klass->properties, name);
}
最后,在遍历(递归)完所有父类之后,调用g_hash_table_lookup(obj->properties, name);在自己的域中查找。
欲知后事如何,且看下回分解。
相关文章:
QEMU源码全解析25 —— QOM介绍(14)
接前一篇文章:QEMU源码全解析24 —— QOM介绍(13) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社 特此致谢! 本文开始对于…...
TopK问题
topK问题: N个数找最大或者最小的前k个。 例子: 优质筛选(店面的排名) 10000个数,找出最大的前10个数 解决思路:建立大堆,然后pop9次 但是有些场景,上面的思路…...
接口自动化测试-Postman+Newman+Git+Jenkins实战集成(详细)
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、Postman 创建…...
CMake 学习笔记 (Generator Expressions)
CMake 学习笔记 (Generator Expressions) Generator Expressions 可以认为是一种特殊的变量,它会在编译阶段求值。通常用在 target_link_libraries(), target_include_directories(), target_compile_definitions() 上。 用 Generator Expr…...
提高测试用例质量的6大注意事项
在软件测试中,经常会遇到测试用例设计不完整,用例没有完全覆盖需求等问题,这样往往容易造成测试工作效率低下,不能及时发现项目问题,无形中增加了项目风险。 因此提高测试用例质量,就显得尤为重要。一般来说…...
2023牛客暑期多校训练营6 A-Tree (kruskal重构树))
文章目录 题目大意题解参考代码 题目大意 ( 0 ≤ a i ≤ 1 ) , ( 1 ≤ c o s t i ≤ 1 0 9 ) (0\leq a_i\leq 1),(1 \leq cost_i\leq 10^9) (0≤ai≤1),(1≤costi≤109) 题解 提供一种新的算法,kruskal重构树。 该算法重新构树,按边权排序每一条边…...
软件测试—支付功能测试
有人问过我这样一个问题:作为一个支付平台,接入了快钱、易宝或直连银行等多家的渠道,内在的产品流程是自己的。业内有什么比较好的测试办法,来测试各渠道及其支持的银行通道呢? 回答:对支付平台而言&#…...
自动化测试的统筹规划
背景 回顾以前自动化测试编写的经历,主要是以开发者自驱动的方式进行,测试的编写随心而动,没有规划,也没有章法,这样就面临如下的一些问题: 测试用例设计不到位,覆盖不全,或者不够…...
外键字段的增删改查、多表查询(子查询和连表查询、正反向、聚合查询、 分组查询、 F与Q查询)、django中如何开启事务
一、 外键字段的增删改查 1.多对多的外键增删改查图书和作者是多对多,借助于第三张表实现的,如果想绑定图书和作者的关系,本质上就是在操作第三方表2.如何操作第三张表问题:让你给图书添加一个作者,他俩的关系可是多对…...
【学习笔记】生成式AI(ChatGPT原理,大型语言模型)
ChatGPT原理剖析 语言模型 文字接龙 ChatGPT在测试阶段是不联网的。 ChatGPT背后的关键技术:预训练(Pre-train) 又叫自监督式学习(Self-supervised Learning),得到的模型叫做基石模型(Founda…...
【Opencv入门到项目实战】(三):图像腐蚀与膨胀操作
文章目录 1.腐蚀操作2.膨胀操作3.开运算和闭运算4.礼帽与黑帽5.梯度运算 1.腐蚀操作 腐蚀操作是图像处理中常用的一种形态学操作,我们通常用于去除图像中的噪声、分割连通区域、减小目标物体的尺寸等。腐蚀操作的原理是,在给定的结构元素下,…...
Autosar诊断系列介绍20 - UDS应用层P2Server/P2Client等时间参数解析
本文框架 1. 前言2.几个时间参数含义2.1 P2Client与P2Server2.2 P2*Client与P2*Server2.3 P3Client_Phys与P3Client_Func2.4 S3Client与S3Server 1. 前言 本系列Autosar 诊断入门介绍,会详细介绍诊断相关基础知识,如您对诊断实战有更高需求,…...
【iOS】json数据解析以及简单的网络数据请求
文章目录 前言一、json数据解析二、简单的网络数据请求三、实现访问API得到网络数据总结 前言 近期写完了暑假最后一个任务——天气预报,在里面用到了简单的网络数据请求以及json数据的解析,特此记录博客总结 一、json数据解析 JSON是一种轻量级的数据…...
Kubernetes客户端认证—— 基于ServiceAccount的JWTToken认证
1、概述 在 Kubernetes 官方手册中给出了 “用户” 的概念,Kubernetes 集群中存在的用户包括 “普通用户” 与 “ServiceAccount”, 但是 Kubernetes 没有普通用户的管理方式,通常只是将使用集群根证书签署的有效证书的用户都被视为合法用户。…...
45.ubuntu Linux系统安装教程
目录 一、安装Vmware 二、Linux系统的安装 今天开始了新的学习,Linux,下面是今天学习的内容。 一、安装Vmware 这里是在 Vmware 虚拟机中安装 linux 系统,所以需要先安装 vmware 软件,然 后再安装 Linux 系统。 所需安装文件:…...
Jmeter函数助手(一)随机字符串(RandomString)
一、目标 实现一个请求单次调用,请求体里多个集合中的相同参数(zxqs)值随机从序列{01、02、03、03、04、05、06、07、08}中取 若使用CSV数据文件、用户参数等参数化手段,单次执行请求,请求体里多个集合中的相同参数&a…...
SpringCloud之微服务API网关Gateway介绍
文章目录 1 微服务API网关Gateway1.1 网关简介1.2 Spring Cloud Gateway介绍1.3 Gateway特性1.4 Gateway核心概念1.4.1 路由1.4.1.1 定义1.4.1.2 动态路由 1.4.2 断言1.4.2.1 默认断言1.4.2.2 自定义Predicate 1.4.3 过滤器1.4.3.1 默认过滤器1.4.3.2 自定义Filter(…...
机器学习入门之 pandas
pandas 有三种数据结构 一种是 Series 一种是 Dataframe import pandas as pd import numpy as np score np.random.randint(0,100,[10,5])score[0,0] 100Datascore pd.DataFrame(score)subject ["语文","数学","英语","物理&quo…...
Django之JWT库与SimpleJWT库的使用
Django之JWT库与SimpleJWT库的使用 JWTJWT概述头部(header)载荷(payload)签名(signature) Django使用JWT说明jwt库的使用安装依赖库配置settings.py文件配置urls.py文件创建视图配置权限 SimpleJWT库的使用安装SimpleJWT库配置Django项目配置路由创建用户接口测试身份认证自定义…...
Jmeter远程服务模式运行时引用csv文件的路径配置
问题 在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。 在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考虑将脚本拷贝到remote主机。但是jmeter…...
Google收紧分发与权限,全球监管聚焦数字生命周期
最近,Google平台治理的节奏明显加快。Google 在安卓生态中持续推进隐私保护与开发者验证的强化,而全球多国监管机构则在儿童安全、游戏停服、账号封禁与内容分级等议题上释放出更具执行力的信号。整体来看,平台透明度、分发控制、隐私权限与数…...
从自然语言到图形化程序:VI Generator如何重塑LabVIEW开发流程
1. VI Generator:当LabVIEW遇上大模型 第一次听说VI Generator时,我正在调试一个自动化测试平台。客户临时要求增加数据滤波功能,这意味着我又要重复拖拽那些熟悉的While循环和数组操作节点。就在我机械地复制粘贴代码时,同事发来…...
MicroMDM实战案例:企业设备管理的成功经验分享
MicroMDM实战案例:企业设备管理的成功经验分享 【免费下载链接】micromdm Mobile Device Management server 项目地址: https://gitcode.com/gh_mirrors/mi/micromdm MicroMDM是一款专注于通过API提供强大功能的移动设备管理服务器,专为苹果设备打…...
自动控制理论(12)——控制系统校正的工程实践与优化
1. 控制系统校正的工程意义 在工业自动化领域,控制系统就像人体的神经系统,需要精确调节才能保证设备稳定运行。想象一下化工反应釜的温度控制:如果响应太慢会导致反应不充分,响应太快又可能引发剧烈振荡。这就是为什么我们需要校…...
别再死记硬背CANopen协议了!用这5个真实工业场景,带你彻底搞懂SDO和PDO怎么选
工业自动化实战:5个场景解析CANopen中SDO与PDO的黄金选择法则 在一条繁忙的汽车装配线上,六台伺服电机需要以微秒级精度同步运转,同时温度传感器阵列实时反馈数据到控制中心——这样的场景下,CANopen协议中的SDO和PDO选择直接决定…...
优化Better BibTeX:解决中文文献引用格式过长问题
1. 中文文献引用格式过长的痛点 写论文时引用中文文献的朋友们,一定遇到过这样的尴尬:参考文献列表里突然冒出一串长得离谱的引用标识符,比如"XuHuoJiBoDaoJiChengGuangXueXiangKongZhenXinPianSheJiNanDianYuTuPo2024"。这种标识符…...
StructBERT中文情感分析模型高可用部署方案
StructBERT中文情感分析模型高可用部署方案 1. 引言 在实际业务场景中,一个情感分析模型不仅要准确,更要稳定可靠。想象一下,电商平台的用户评论实时分析、客服系统的情绪识别、社交媒体的舆情监控——这些场景都需要724小时不间断的服务。…...
从零搞懂Transformer,从位置编码到自注意力,大模型的核心逻辑全拆解
平时我们用ChatGPT聊天、用翻译软件做中英互译、用AI写文案,甚至让AI帮忙编代码,背后最核心的“功臣”,都是2017年Google团队提出的Transformer模型。这个看起来复杂的模型,其实打破了传统AI的局限,靠着高效的计算能力…...
UndertaleModTool终极指南:3步构建你的个性化游戏世界
UndertaleModTool终极指南:3步构建你的个性化游戏世界 【免费下载链接】UndertaleModTool The most complete tool for modding, decompiling and unpacking Undertale (and other GameMaker games!) 项目地址: https://gitcode.com/gh_mirrors/un/UndertaleModTo…...
告别Hello World:用TensorFlow Lite Micro在Arduino上部署你的第一个TinyML模型(附完整代码)
从零到硬件:TinyML模型在Arduino上的完整部署指南 当我在三年前第一次尝试将机器学习模型部署到Arduino Nano 33 BLE Sense开发板上时,LED灯闪烁的那一瞬间,我意识到嵌入式AI的世界远比想象中更触手可及。TinyML正在彻底改变我们与微控制器的…...
