QEMU 新增QMPHMP指令【原文阅读】

news2024/9/9 5:39:56

文章目录

  • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1961762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

reese84分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

最近火爆的GraphRAG是什么?真的那么有用吗?

最近&#xff0c;微软提出的GraphRAG项目引起了广泛关注。那么&#xff0c;GraphRAG究竟是什么&#xff1f;它真的那么实用吗&#xff1f;本文将为您详细解读GraphRAG的概念及其应用。 什么是传统的RAG&#xff1f; &#x1f4da; 在深入了解GraphRAG之前&#xff0c;我们首先…

掌握AJAX技术:从基础到实战

文章目录 **引言****1. 什么是AJAX&#xff1f;****2. AJAX的工作原理**AJAX 示例使用 Fetch API 实现 AJAX **3. 如何在项目中使用AJAX****4. 处理AJAX请求的常见问题****5. AJAX与JSON的结合****6. 使用AJAX框架和库****7. 实战&#xff1a;创建一个动态表单****8. AJAX中的事…

Python 解决 ImportError: cannot import name ‘example’

Python 解决 ImportError: cannot import name ‘example’ 在Python编程的广阔天地中&#xff0c;ImportError: cannot import name example 是一个令人头疼但又常见的错误。当你试图从某个模块中导入一个不存在的名称时&#xff0c;这个错误就会悄然降临。本文将带你深入探索…

AI推理硬件成本分析:AMD Instinct MI300X与Nvidia GPU比较

随着AI模型训练成本的上升&#xff0c;人们越来越关注推理硬件的成本&#xff0c;尤其是在需要低延迟响应的应用中。Transformer模型需要强大的硬件支持&#xff0c;例如200毫秒以下的响应时间。Artificial Analysis最近分析了AI模型性能和定价&#xff0c;特别指出AMD的“Anta…

「豆包Marscode体验官」AI加持的云端IDE——三种方法高效开发前后端聊天交互功能

豆包 MarsCode 是一个集成了AI功能的编程助手和云端IDE&#xff0c;旨在提高开发效率和质量。它支持多种编程语言和IDE&#xff0c;提供智能代码补全、代码解释、单元测试生成和问题修复等功能&#xff0c;同时具备AI对话视图和开发工具。 豆包 MarsCode 豆包 MarsCode 编程助…

跟着动脑学院学习Android 开发基础

跟着动脑学院up主学习Android开发&#xff0c;记录学习笔记 2022 最新 Android 基础教程&#xff0c;从开发入门到项目实战&#xff0c;看它就够了&#xff0c;更新中_哔哩哔哩_bilibili &#xff08;弱弱地说一句&#xff0c;绝大部分内容都是up主为我们准备好的资料里摘抄下…

机器学习 | 评估原理——模型评估与交叉验证

Hi&#xff0c;大家好&#xff0c;我是半亩花海。学完分类算法原理的知识&#xff0c;我们进入评估相关知识的学习&#xff0c;继续更新《白话机器学习的数学》这本书的学习笔记&#xff0c;在此分享模型评估与交叉验证相关评估原理。本章的基于前几节已建立的模型进行评估知识…

【C语言】Linux 飞翔的小鸟

【C语言】Linux 飞翔的小鸟 零、环境部署 安装Ncurses库 sudo apt-get install libncurses5-dev壹、编写代码 代码如下&#xff1a; bird.c #include<stdio.h> #include<time.h> #include<stdlib.h> #include<signal.h> #include<curses.h>…

LeetCode:相同的树(C语言)

1、问题概述&#xff1a;给2个二叉树的根节点p和q&#xff0c;如果2个树在结构和数值上都相同才为true&#xff0c;否则为false 2、示例 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;p [1,2], q […

做知识付费项目还能做吗?知识付费副业项目如何做?能挣多少钱?

hello,我是阿磊&#xff0c;一个20年的码农&#xff0c;6年前代码写不动了&#xff0c;转型专职做副业项目研究&#xff0c;为劳苦大众深度挖掘互联网副业项目&#xff0c;共同富裕。 现在做知识付费项目还能做吗&#xff1f; 互联网虚拟资源项目我一直在做&#xff0c;做了有…

AI绘画模型之:UNet、Imagen 与 DeepFloyd IF

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

spring boot(学习笔记第十五课)

spring boot(学习笔记第十五课) Spring boot的websocket(广播) 学习内容&#xff1a; Spring boot的websocket&#xff08;广播&#xff09; 1. Spring boot的websocket&#xff08;广播&#xff09; 回顾下web server的进化 第一代Web程序&#xff0c;使用整体页面刷新技术…

GPT-4o mini- 开发者的新宠儿

在人工智能的浪潮中,一颗新星正在冉冉升起。OpenAI最新发布的GPT-4o mini模型以其惊人的性能和极具竞争力的价格,正在成为开发者们的新宠儿。作为一名大数据开发者,我深深被这个"迄今为止最具成本效益的小模型"所吸引。让我们一起探索GPT-4o mini的魅力,看看它如何改…

一些问题 7/28

get post可以public吗 在Java Servlet中&#xff0c;doGet()和doPost()方法的访问修饰符通常是public&#xff0c;因为这些方法需要被Servlet容器&#xff08;如Tomcat&#xff09;调用。 如果将这些方法声明为private或protected&#xff0c;Servlet容器将无法访问它们&…

RocketMQ Server Windows安装

RocketMQ阿里开发 开源给apache 官网:RocketMQ 官方网站 | RocketMQ 下载后解压 配置环境变量 注意启动顺序 双击 注意 4.9.0这个版本必须 jdk 8 高了用不了 namesrv是注册中心的作用 broke是核心用于接收生产者消息 存储消息 发送给消费者消息 类似DubboZookeeper…

C++ 绘制画布标尺

目标 关键代码 CRulerDrawer::CRulerDrawer(QPainter& painter, QRect rect, int scalePercent): m_painter(painter), m_rect(rect), m_scalePercent(scalePercent) {m_palette qApp->palette();m_scaleUnitSize PixelRuler::Instance()->GetScaleUnitSize(); }vo…

【JS|第22期】深入理解跨域

日期&#xff1a;2024年7月6日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xff…

Vue开发环境搭建

文章目录 引言I 安装NVM1.1 Windows系统安装NVM,实现Node.js多版本管理1.2 配置下载镜像1.3 NVM常用操作命令II VUE项目的基础配置2.1 制定不同的环境配置2.2 正式环境隐藏日志2.3 vscode常用插件引言 开发工具: node.js 、npm 开发编辑器:vscode 开发框架:VUE I 安装NVM…

react中zuStand状态管理工具使用

一、zuStand的基本使用 1.安装工具 npm install zustand 2.新建文件 在src下新建store文件夹&#xff0c;在store文件夹下新建zuStand.js文件 3.配置zuStand.js // 1.引入创建方法 import { create } from "zustand";// 2.创建store const useStore create((s…