qemu中的qom object对象理解
#include stdio.h#include string.h#include stdlib.h// 第一步定义核心结构体模拟QOM的Object/Class/Type // 1. 类型元信息对应QEMU的TypeImpl记录类型名父类型描述继承关系typedef struct TypeInfo {const char *name; // 类型名比如Device、PL181struct TypeInfo *parent; // 父类型继承关系} TypeInfo;// 2. 类结构体对应QEMU的ObjectClass绑定类型元信息typedef struct ObjectClass {TypeInfo *type; // 该类对应的类型元信息} ObjectClass;// 3. 基类Object对应QEMU的Objecttypedef struct Object {ObjectClass *class; // 每个对象关联一个类} Object;// 4. 设备基类DeviceState对应QEMU的DeviceState继承Objecttypedef struct DeviceState {Object parent_obj; // 父类放在第一个位置核心保证指针转换对齐const char *id; // 设备特有属性ID} DeviceState;// 5. PL181设备继承DeviceStatetypedef struct PL181State {DeviceState parent_obj; // 继承DeviceStateint irq_count; // PL181特有属性中断数量} PL181State;// 第二步定义核心辅助函数模拟QEMU的类型检查 // 1. 检查type1是否是type2的祖先对应QEMU的type_is_ancestorint type_is_ancestor(TypeInfo *type1, TypeInfo *type2) {// 遍历type1的继承链看是否能找到type2while (type1) {if (type1 type2) {return 1; // 是祖先返回true}type1 type1-parent; // 往上找父类型}return 0; // 不是祖先返回false}// 2. 类级动态转换对应QEMU的object_class_dynamic_castObjectClass *object_class_dynamic_cast(ObjectClass *class, TypeInfo *target_type) {if (!class || !target_type) {return NULL;}// 核心逻辑检查当前类的类型是否继承目标类型if (type_is_ancestor(class-type, target_type)) {return class; // 转换成功}return NULL; // 转换失败}// 3. 对象级动态转换对应QEMU的object_dynamic_castvoid *object_dynamic_cast(Object *obj, TypeInfo *target_type) {if (!obj) {return NULL;}// 先检查类是否能转换类能转则对象能转核心if (object_class_dynamic_cast(obj-class, target_type)) {return obj; // 返回原对象指针因为父类在第一个位置地址对齐}return NULL;}// 4. 简化版DEVICE宏对应QEMU的DEVICE(obj)#define DEVICE(obj) \((DeviceState *)object_dynamic_cast((Object *)obj, type_device))// 第三步初始化类型和对象模拟QEMU的设备创建 // 1. 定义类型元信息构建继承链Object → Device → PL181TypeInfo type_object {.name Object, .parent NULL};TypeInfo type_device {.name Device, .parent type_object};TypeInfo type_pl181 {.name PL181, .parent type_device};// 2. 定义类每个类绑定对应的类型元信息ObjectClass class_object {.type type_object};ObjectClass class_device {.type type_device};ObjectClass class_pl181 {.type type_pl181};// 3. 创建PL181对象模拟QEMU的设备初始化PL181State pl181_dev {.parent_obj { // 初始化DeviceState父类.parent_obj { // 初始化Object父类.class class_pl181 // 关联PL181类},.id pl181_0 // 设备ID},.irq_count 2 // PL181的中断数量};// 第四步测试类型转换 int main() {// 把PL181对象指针转为通用Object*模拟QEMU的obj参数Object *obj (Object *)pl181_dev;// 1. 测试DEVICE(obj)转换PL181→DeviceDeviceState *dev DEVICE(obj);if (dev) {printf(转换成功PL181 → Device\n);printf(设备ID%s\n, dev-id); // 能正常访问Device的属性} else {printf(转换失败\n);}// 2. 测试反向转换非法Device→PL181这里仅演示PL181State *pl181 (PL181State *)object_dynamic_cast(obj, type_pl181);if (pl181) {printf(转换成功Object → PL181\n);printf(PL181中断数量%d\n, pl181-irq_count); // 能正常访问PL181的属性}return 0;}其实核心就一句话父类的结构体是子类结构体的子集并且父类的第一个成员一定是子类的第一个成员子类转父类 天然可以 大转小父类转子类 小转大 必须确认父类是否包含了子类的各个成分。 object_class_dynamic_cast换到c语言结构体来理解就没有那么C类那么玄乎无非就是强制类型转换转换之后还能访问到相应的正确的内容。c结构体在内存中位置是相近一个整体。container_of(ptr, type, member)可执行代码在内存中也是相近的代码上下文这就涉及到指令cache的命中......

相关新闻

MATLAB环境下基于高阶统计与改进小波块阈值的信号降噪探索

MATLAB环境下基于高阶统计与改进小波块阈值的信号降噪探索

MATLAB环境下一种基于高阶统计和改进小波块阈值方法的微地震信号降噪方法。 测试了不同小波morlet, shannon, mhat, hhat的降噪效果。 算法可迁移至金融时间序列,地震信号,语音信号,声信号,生理…

2026/7/3 20:11:32 阅读更多 →
2026年专业深度测评:正品燕窝排名前五品牌权威榜单

2026年专业深度测评:正品燕窝排名前五品牌权威榜单

一、开篇:行业趋势与测评目的随着大健康消费理念的持续深化,燕窝作为传统滋补品的代表,其市场需求日益精细化与专业化。消费者对正品燕窝的品质、安全与数据透明度的要求达到前所未有的高度,如何甄别真伪、选择可靠品牌成为核心决…

2026/7/4 5:30:57 阅读更多 →
单片机/C语言八股:(五)32/64 位系统中,C/C++各变量类型所占字节数

单片机/C语言八股:(五)32/64 位系统中,C/C++各变量类型所占字节数

上一篇下一篇volatile 和 static 关键字在 32 位和 64 位系统中,C 语言中各基本数据类型的大小并不完全由“32/64 位”决定,而是由 编译器 操作系统 ABI(应用二进制接口) 共同决定。C 中基本数据类型的大小规则与 C 语言在相同平…

2026/7/4 16:26:28 阅读更多 →

最新新闻

符合出口标准的胡萝卜种子如何挑选抗逆品种?2026 种植采购实操指南

符合出口标准的胡萝卜种子如何挑选抗逆品种?2026 种植采购实操指南

很多从事胡萝卜规模化种植,特别是瞄准出口市场的技术负责人和种植户,经常面临一个核心困境:如何在海量的种子品种中,精准筛选出兼具抗逆性、商品性和高产潜力的品种,并构建一套可复制的稳产方案?市面上的营…

2026/7/5 3:04:55 阅读更多 →
大气散射模型 OpenCV 4.8 去雾实战:单张图像 0.5 秒内透射率图估计

大气散射模型 OpenCV 4.8 去雾实战:单张图像 0.5 秒内透射率图估计

基于暗通道先验的实时去雾算法:OpenCV 4.8 工程实现详解清晨的浓雾常常让摄影作品失去应有的色彩与细节,而计算机视觉领域的去雾算法正是解决这一问题的利器。本文将带您深入浅出地实现一个基于暗通道先验的高效去雾系统,仅用不到0.5秒即可完…

2026/7/5 3:04:55 阅读更多 →
靠谱的区域教育一体化管理平台哪个排名高

靠谱的区域教育一体化管理平台哪个排名高

在当今信息化时代,教育行业的数字化转型已经成为必然趋势。区域教育一体化管理平台作为提升教育管理水平、优化教育资源配置的重要工具,受到了越来越多教育机构的关注。然而,在众多的教育管理平台中,如何选择一个既可靠又高效的平…

2026/7/5 3:04:55 阅读更多 →
多重共线性实战指南:识别、归因与工程化解法

多重共线性实战指南:识别、归因与工程化解法

1. 项目概述:为什么多重共线性不是“错误”,而是数据在说话你刚跑完一个线性回归模型,R高达0.92,F检验p值小于0.001,一切看起来都很漂亮——直到你扫了一眼系数表:某个自变量的系数是3.7,标准误…

2026/7/5 3:02:54 阅读更多 →
云原生技术28-K8s排障实战:20个常见问题的快速定位与解决,从CrashLoopBackOff到Running的完整指南

云原生技术28-K8s排障实战:20个常见问题的快速定位与解决,从CrashLoopBackOff到Running的完整指南

1、AI程序员系列文章 2、AI面试系列文章 3、AI编程系列文章 目录 排障思维:从"盲人摸象"到"精准定位" 2.1 自上而下 vs 自下而上 2.2 假设验证法 2.3 二分法定位 Pod问题:四大金刚的"病历本" 3.1 CrashLoopBackOff&…

2026/7/5 3:00:53 阅读更多 →
Codex 实战:AI 编程助手接入真实项目,用真实案例讲清边界

Codex 实战:AI 编程助手接入真实项目,用真实案例讲清边界

聊《Codex 实战:AI 编程助手接入真实项目,用真实案例讲清边界》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要这篇面向想用 AI 提升研发效率的开发者和技术负责人,但不会把“…

2026/7/5 3:00:53 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻