QEMU 新增QMPHMP指令【原文阅读】
文章目录
- 0x0 QEMU原文
- 0x1
- 0x11 How to write monitor commands
- 0x12 Overview
- 0x13 Testing
- 0x2
- 0x21 Writing a simple command: hello-world
- 0x22 Arguments
- 0x3
- 0x31 Implementing the HMP command
- 0x4
- 0x41 Writing more complex commands
- 0x42 Modelling data in QAPI
- 0x43 User Defined Types
- 0x44 The HMP command
- 0x45 Writing a debugging aid returning unstructured text
- 0x46 Implementing the QMP command
- 0x47 Implementing the HMP command
0x0 QEMU原文
https://www.qemu.org/docs/master/devel/writing-monitor-commands.html
0x1
0x11 How to write monitor commands
本文档是关于如何使用QAPI框架和HMP命令编写新的QMP命令的分步指南。
本文不讨论QMP协议级别的细节,也不深入讨论QAPI框架的实现。
有关QAPI框架的深入介绍,请参考
关于QMP协议,请参考
新命令只能在QMP中实现。新的HMP命令应该在QMP的基础上实现。
典型的HMP命令包装在等效的QMP命令周围,但从QMP构建块构建的HMP方便命令也很好。
长期目标是使所有现有的HMP命令都符合此要求,以便将HMP与QEMU的内部完全隔离。
请参阅编写返回非结构化文本的调试辅助工具一节,了解有关传统上仅为HMP的命令的进一步指导。
0x12 Overview
一般来说,为了编写一个新的QMP命令,应该采取以下步骤:
1、在适当的QAPI模式模块中定义命令和它需要的任何类型。
2、编写QMP命令本身,这是一个常规的C函数。最好,该命令应该由某个QEMU子系统导出。但也可以将其添加到monitor/qmp-cmds.c文件中
3、此时可以在QMP协议下测试命令。
4、这不是必需的,只有当在HMP中具有该功能确实有意义时,才应该这样做。
HMP命令是通过QMP命令来实现的,下面的部分将演示上面的每个步骤。我们将从非常简单的开始,并随着我们的进展而变得更加复杂。
0x13 Testing
对于下一节中的所有示例,测试设置都是相同的,如下所示。
首先,QEMU应该像这样启动:
# qemu-system-TARGET [...] \-chardev socket,id=qmp,port=4444,host=localhost,server=on \-mon chardev=qmp,mode=control,pretty=on
然后,在另一个终端中:
$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
{"QMP": {"version": {"qemu": {"micro": 50,"minor": 2,"major": 8},"package": ...},"capabilities": ["oob"]}
}
上面的输出是QMP服务器说你已经连接了。服务器实际上处于能力协商模式。要进入命令模式,请键入:
{ "execute": "qmp_capabilities" }
则服务器应响应:
{"return": {}
}
这就是QMP的说法“最新的命令执行正常,没有返回任何数据”。现在,您可以输入QMP示例命令,如下文所述。
0x2
0x21 Writing a simple command: hello-world
这就是可以编写的最简单的QMP命令。
通常,此类命令在QEMU中携带一些有意义的操作,但在这里,它只是将“Hello,world”打印到标准输出。
我们的命令将被称为“hello-world”。它不接受任何参数,也不返回任何数据。
第一步是在适当的QAPI模式模块中定义命令。我们选择模块qapi/misc.json,并在底部添加以下行:
##
# @hello-world:
#
# Since: 9.0
##
{ 'command': 'hello-world' }
“command”关键字定义新的QMP命令。它指示QAPI生成任何原型和必要的代码来封送和拆封协议数据
下一步是编写“hello-world”实现。如前所述,命令最好位于QEMU子系统中。
但是“hello-world”并不涉及任何,因此我们将其实现放在monitor/qmp-cmds.c中:
void qmp_hello_world(Error **errp)
{printf("Hello, world!\n");
}
QMP命令实现函数必须以“qmp_”为前缀
qmp_hello_world()返回void,这与该命令不返回任何数据的事实相符,
它采用“Error**”参数。这是必需的。稍后,我们将看到如何返回错误并接受额外的参数。如果命令没有返回错误,则不应使用Error参数
我们不会添加函数的原型。这是由QAPI自动完成的。
不建议使用QMP命令打印到终端,我们在这里这样做,因为这是演示QMP命令最简单的方法
你完了。现在构建QEMU,按照“测试”一节中的建议运行它,然后键入以下QMP命令:
{ "execute": "hello-world" }
然后检查运行QEMU的终端,查找“Hello,world”字符串。如果你没有看到它,那么就出了问题。
0x22 Arguments
0x3
0x31 Implementing the HMP command
让我们向“hello-world”命令添加参数。
我们要做的第一个更改是将模式文件中的命令规范修改为:
##
# @hello-world:
#
# @message: message to be printed (default: "Hello, world!")
#
# @times: how many times to print the message (default: 1)
#
# Since: 9.0
##
{ 'command': 'hello-world','data': { '*message': 'str', '*times': 'int' } }
注意模式中的新’data’成员。它指定一个QAPI类型’str’的参数’message’和一个QAPI类型’int’的参数’times’。另请注意星号,它用于标记参数可选。
现在,让我们在monitor/qmp-cmds.c中更新我们的C实现:
void qmp_hello_world(const char *message, bool has_times, int64_t times,Error **errp)
{if (!message) {message = "Hello, world";}if (!has_times) {times = 1;}for (int i = 0; i < times; i++) {printf("%s\n", message);}
}
有两个重要的细节需要注意:
除了指针之外的可选参数都伴随着一个’has_'布尔值,如果可选参数存在,则设置该布尔值,否则设置该布尔值。
C实现签名必须遵循模式的参数顺序,该顺序由“data”成员定义,以测试我们的新版本的“hello-world”命令。
构建QEMU,按照“测试”部分所述运行它,然后发送两个命令:
{ "execute": "hello-world" }
{"return": {}
}{ "execute": "hello-world", "arguments": { "message": "We love QEMU" } }
{"return": {}
}
您应该在运行QEMU的终端中看到“Hello,world”和“We love QEMU”,如果您没有看到这些字符串,那么就出问题了
0x4
0x41 Writing more complex commands
0x42 Modelling data in QAPI
0x43 User Defined Types
0x44 The HMP command
0x45 Writing a debugging aid returning unstructured text
0x46 Implementing the QMP command
0x47 Implementing the HMP command
相关文章:
QEMU 新增QMPHMP指令【原文阅读】
文章目录 0x0 QEMU原文0x10x11 How to write monitor commands0x12 Overview0x13 Testing 0x20x21 Writing a simple command: hello-world0x22 Arguments 0x30x31 Implementing the HMP command 0x40x41 Writing more complex commands0x42 Modelling data in QAPI0x43 User D…...
【Linux】全志Tina配置屏幕时钟的方法
一、文件位置 V:\f1c100s\Evenurs\f1c100s\tina\device\config\chips\c200s\configs\F1C200s\sys_config.fex 二、文件内容 三、介绍 在此处可以修改屏幕的频率,当前为21MHz。 四、总结 注意选择对应的屏幕的参数,sdk所支持的屏幕信息都在此文件夹中…...
探索WebKit的CSS表格布局:打造灵活的网页数据展示
探索WebKit的CSS表格布局:打造灵活的网页数据展示 CSS表格布局是一种在网页上展示数据的强大方式,它允许开发者使用CSS来创建类似于传统HTML表格的布局。WebKit作为许多流行浏览器的渲染引擎,提供了对CSS表格布局的全面支持。本文将深入探讨…...
信号的运算
信号实现运算,首先要明确,电路此时为负反馈电路,当处于深度负反馈时,可直接使用虚短虚断。负反馈相关内容可见:放大电路中的反馈_基极反馈-CSDN博客https://blog.csdn.net/qq_63796876/article/details/140438759 一、…...
Vue3知识点汇总
创建项目 npm init vuelatest // npm create vitelatestVue文件结构 <!-- 开关:经过语法糖的封装,容许在script中书写组合式API --> <!-- setup在beforeCreate钩子之前自动执行 --> <script setup><!-- 不再要求唯一根元素 -->…...
C++设计模式--单例模式
单例模式的学习笔记 单例模式是为了:在整个系统生命周期内,保证一个类只能产生一个实例,确保该类的唯一性 参见链接1,链接2 #include <iostream> #include <mutex>using namespace std;/*懒汉模式:只有在…...
数据驱动未来:构建下一代湖仓一体电商数据分析平台,引领实时商业智能革命
1.1 项目背景 本项目是一个创新的湖仓一体实时电商数据分析平台,旨在为电商平台提供深度的数据洞察和业务分析。技术层面,项目涵盖了从基础架构搭建到大数据技术组件的集成,采用了湖仓一体的设计理念,实现了数据仓库与数据湖的有…...
学习JavaScript第五天
文章目录 1.HTML DOM1.1 表单相关元素① form 元素② 文本输入框类和文本域(input 和 textarea)③ select 元素 1.2 表格相关元素① table 元素② tableRow 元素(tr 元素)③ tableCell 元素 (td 或 th) 1.3…...
pythonGame-实现简单的坦克大战
通过python简单复现坦克大战游戏。 使用到的库函数: import turtle import math import random import time 游戏源码: import turtle import math import random import time# 设置屏幕 screen turtle.Screen() screen.setup(800, 600) screen.tit…...
不太常见的asmnet诊断
asm侦听 [griddb1-[ASM1]-/home/grid]$ srvctl config asm ASM home: <CRS home> Password file: OCR/orapwASM Backup of Password file: OCRDG/orapwASM_backup ASM listener: LISTENER ASM instance count: 3 Cluster ASM listener: ASMNET1LSNR_ASM[rootdb1:/root]# …...
双指针-【3,4,5,6,7,8】
第三题:快乐数 . - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/happy-number/算法思想: 1.每个…...
react Vant中如何获取步进器的值
在React中使用Vant(一个轻量、可靠的移动端Vue组件库,虽然原生是为Vue设计的,但如果你在使用的是React版本的Vant,比如通过某些库或框架桥接Vue组件到React,或者是一个类似命名的React UI库),获…...
Windows下Git Bash乱码问题解决
Windows下Git Bash乱码问题解决 缘起 个人用的电脑是Mac OS,系统和终端编码都是UTF-8,但公司给配发的电脑是Windows,装上Git Bash在使用 git commit -m "中文"时会乱码 解决 确认有以下配置 # 输入 git config --global --lis…...
HTML5 + CSS3
HTML 基础 准备开发环境 1.vscode 使用 新建文件夹 ---> 左键拖入 vscode 中 2.安装插件 扩展 → 搜索插件 → 安装打开网页插件:open in browser汉化菜单插件:Chinese 3.缩放代码字号 放大,缩小:Ctrl 加号,减号 4.设…...
NFTScan | 07.22~07.28 NFT 市场热点汇总
欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.07.22~ 2024.07.28 NFT Hot News 01/ 数据:NFT 系列 Liberty Cats 地板价突破 70000 MATIC 7 月 22 日,据 Magic Eden 数据,NFT 系列 Liberty C…...
探索分布式光伏运维系统的组成 需要几步呢?
前言 随着光伏发电的不断发展,对于光伏发电监控系统的需求也日益迫切,“互联网”时代,“互联网”的理念已经转化为科技生产的动力,促进了产业的升级发展,本文结合“互联网”技术提出了一种针对分散光伏发电站运行数据…...
做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?
hello,我是阿磊,一个20年的码农,6年前代码写不动了,转型专职做副业项目研究,为劳苦大众深度挖掘互联网副业项目,共同富裕。 现在做知识付费项目还能做吗? 互联网虚拟资源项目我一直在做,做了有…...
K210视觉识别模块学习笔记7:多线程多模型编程识别
今日开始学习K210视觉识别模块: 图形化操作函数 亚博智能 K210视觉识别模块...... 固件库: canmv_yahboom_v2.1.1.bin 训练网站: 嘉楠开发者社区 今日学习使用多线程、多模型来识别各种物体 这里先提前说一下本文这次测试实验的结果吧:结果是不太成…...
Go语言教程(一看就会)
全篇文章 7000 字左右, 建议阅读时长 1h 以上。 Go语言是一门开源的编程语言,目的在于降低构建简单、可靠、高效软件的门槛。Go平衡了底层系统语言的能力,以及在现代语言中所见到的高级特性。它是快速的、静态类型编译语言。 第一个GO程序…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
