【QEMU系统分析之实例篇(十五)】

系列文章目录

第十五章 QEMU系统仿真的机器创建分析实例


文章目录

  • 系列文章目录
    • 第十五章 QEMU系统仿真的机器创建分析实例
  • 前言
  • 一、QEMU是什么?
  • 二、QEMU系统仿真的机器创建分析实例
    • 1.系统仿真的命令行参数
    • 2.应用旧的机器设置项
      • qemu_apply_legacy_machine_options()
        • keyval_dashify();
        • 移除与机器状态属性无关的旧配置项
    • 3.调试输出
  • 总结


前言

本文以 QEMU 8.2.2 为例,分析其作为系统仿真工具的工作过程,并为读者展示各种 QEMU 系统仿真的启动配置实例。
本文读者需要具备一定的 QEMU 系统仿真使用经验,并对 C 语言编程有一定了解。


一、QEMU是什么?

QEMU 是一个通用且开源的机器模拟器和虚拟机。
其官方主页是:https://www.qemu.org/


二、QEMU系统仿真的机器创建分析实例

1.系统仿真的命令行参数

QEMU 作为系统仿真工具,其入口代码在 system/main.c 文件中,初始化函数 qemu_init() 的实现在 system/vl.c 文件中。
前文完成创建目标机器的过程分析,本文将继续后续运行过程的分析,读者需要对 QEMU 系统启动过程的程序代码有所了解,相关内容可以参考《QEMU系统分析之启动篇》系列文章。

..\qemu\8.2.2-qkd\qemu-system-x86_64.exe -cpu "Penryn" -M  "q35,accel=whpx,smm=off" -m "6G" -display "sdl" -audio "sdl,model=hda" -vga "std" -L "data"

2.应用旧的机器设置项

这部分代码在 system/vl.c 文件中,实现如下:

int qemu_init(int argc, char **argv)
{
...qemu_apply_legacy_machine_options(machine_opts_dict);
...
}

前文分析了创建后端驱动过程中控制台和字符设备的创建过程,本文继续完成块设备和音频设备驱动的创建过程。


qemu_apply_legacy_machine_options()

函数 qemu_apply_legacy_machine_options() 代码如下:

static void qemu_apply_legacy_machine_options(QDict *qdict)
{const char *value;QObject *prop;keyval_dashify(qdict, &error_fatal);/* Legacy options do not correspond to MachineState properties.  */value = qdict_get_try_str(qdict, "accel");if (value) {accelerators = g_strdup(value);qdict_del(qdict, "accel");}value = qdict_get_try_str(qdict, "igd-passthru");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), "igd-passthru", value,false);qdict_del(qdict, "igd-passthru");}value = qdict_get_try_str(qdict, "kvm-shadow-mem");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kvm-shadow-mem", value,false);qdict_del(qdict, "kvm-shadow-mem");}value = qdict_get_try_str(qdict, "kernel-irqchip");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kernel-irqchip", value,false);object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), "kernel-irqchip", value,false);qdict_del(qdict, "kernel-irqchip");}value = qdict_get_try_str(qdict, "memory-backend");if (value) {if (mem_path) {error_report("'-mem-path' can't be used together with""'-machine memory-backend'");exit(EXIT_FAILURE);}/* Resolved later.  */ram_memdev_id = g_strdup(value);qdict_del(qdict, "memory-backend");}prop = qdict_get(qdict, "memory");if (prop) {have_custom_ram_size =qobject_type(prop) == QTYPE_QDICT &&qdict_haskey(qobject_to(QDict, prop), "size");}
}

首先对关键字和值做连字符处理。


keyval_dashify();

代码如下:

/* *Non*recursively replace underscores with dashes in QDict keys.  */
static void keyval_dashify(QDict *qdict, Error **errp)
{const QDictEntry *ent, *next;char *p;for (ent = qdict_first(qdict); ent; ent = next) {g_autofree char *new_key = NULL;next = qdict_next(qdict, ent);if (!strchr(ent->key, '_')) {continue;}new_key = g_strdup(ent->key);for (p = new_key; *p; p++) {if (*p == '_') {*p = '-';}}if (qdict_haskey(qdict, new_key)) {error_setg(errp, "Conflict between '%s' and '%s'", ent->key, new_key);return;}qobject_ref(ent->value);qdict_put_obj(qdict, new_key, ent->value);qdict_del(qdict, ent->key);}
}

如果做连字符处理后关键字有冲突,则出错返回。


移除与机器状态属性无关的旧配置项

代码如下:

static void qemu_apply_legacy_machine_options(QDict *qdict)
{
.../* Legacy options do not correspond to MachineState properties.  */value = qdict_get_try_str(qdict, "accel");if (value) {accelerators = g_strdup(value);qdict_del(qdict, "accel");}value = qdict_get_try_str(qdict, "igd-passthru");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("xen"), "igd-passthru", value,false);qdict_del(qdict, "igd-passthru");}value = qdict_get_try_str(qdict, "kvm-shadow-mem");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kvm-shadow-mem", value,false);qdict_del(qdict, "kvm-shadow-mem");}value = qdict_get_try_str(qdict, "kernel-irqchip");if (value) {object_register_sugar_prop(ACCEL_CLASS_NAME("kvm"), "kernel-irqchip", value,false);object_register_sugar_prop(ACCEL_CLASS_NAME("whpx"), "kernel-irqchip", value,false);qdict_del(qdict, "kernel-irqchip");}value = qdict_get_try_str(qdict, "memory-backend");if (value) {if (mem_path) {error_report("'-mem-path' can't be used together with""'-machine memory-backend'");exit(EXIT_FAILURE);}/* Resolved later.  */ram_memdev_id = g_strdup(value);qdict_del(qdict, "memory-backend");}prop = qdict_get(qdict, "memory");if (prop) {have_custom_ram_size =qobject_type(prop) == QTYPE_QDICT &&qdict_haskey(qobject_to(QDict, prop), "size");}
}

3.调试输出

首先,添加跟踪调试信息,修改后的代码如下:

static void qemu_create_early_backends(void)
{...huedbg_flag = 1;HUEDBG("\n");huedbg_dump_device_configs(2);HUEDBG("\n");qemu_create_early_backends();HUEDBG("\n");huedbg_dump_device_configs(2);HUEDBG("\n");huedbg_flag = 0;...
}

运行后,输出信息如下:



总结

以上分析了系统初始化过程中应用旧的机器设置项的过程。

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

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

相关文章

ROS2学习——Docker环境下安装于使用(1)

目录 一、简要 二、ROS2和ROS1区别 三、环境搭建与安装 (2)拉取ubuntu22.04镜像 (2)安装ROS2 1. 基本设置 2.设置源 3.安装ROS2功能包 4.测试 四、相关指令学习 1.小海龟测试 2.ros2 node等指令 3.rqt 一、简要 随着R…

Git常用(持续更新)

常用场景: 初始化: git config --global user.name "codelabs" git config --global user.email mycodelabs.com git init git remote add origin https://github.com/username/repository.git git pull origin master 提交: gi…

踏春正当时!VELO Prevail Ride带你探索多元骑行潮流体验~

嘿,朋友!踏春正当时嘞!在这个追求个性化与多元化的新时代,骑行爱好者们也开始寻找能适应各种骑行场景的理想坐垫。从悠闲自在的日常通勤,到热血沸腾的公路竞速,再到勇攀高峰的山地探险,维乐VELO…

HNU-人工智能-实验3-贝叶斯分类器

人工智能-实验3 计科210x 甘晴void 【感悟】本实验值得自己完成一遍 文章目录 人工智能-实验3一、实验目的二、实验平台三、实验内容3.0 基础知识3.1 条件概率(选择题)3.2 贝叶斯公式(选择题)3.3 朴素贝叶斯分类算法流程3.3.1 算…

多线程系列(三) -synchronized 关键字使用详解

一、简介 在之前的线程系列文章中,我们介绍了线程创建的几种方式以及常用的方法介绍。 今天我们接着聊聊多线程线程安全的问题,以及解决办法。 实际上,在多线程环境中,难免会出现多个线程对一个对象的实例变量进行同时访问和操…

3-qt综合实例-贪吃蛇的游戏程序

引言: 如题,本次实践课程主要讲解贪吃蛇游戏程序。 qt贪吃蛇项目内容: 一、功能需求 二、界面设计 各组件使用: 对象名 类 说明 Widget QWidge 主窗体 btnRank QPushButton 排行榜-按钮 groupBox QGroupBox 难…

【数据结构与算法】力扣 347. 前 K 个高频元素

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: [1]提示&#xff1a; 1 < nums.length < …

python数据分析——数据分析的统计推断

数据分析的统计推断 前言一、提出问题二、统计归纳方法三、统计推断四、统计推断步骤4.1.点估计4.2.区间估计4.2.1. 总体方差已知4.2.2总体方差未知 4.3. 假设检验4.4. 假设检验的假设4.5.显著性水平 五、检验统计量六、检验方法七、拒绝域八、假设检验步骤九、重要假设检验方法…

伺服电机初识

目录 一、伺服电机的介绍二、伺服电机的基本原理三、伺服电机的技术特点四、伺服电机的分类五、实际产品介绍1、基本技术规格&#xff1a;2、MD42电机硬件接口3、通讯协议介绍3.1 通讯控制速度运行3.2 通讯控制位置运行3.3 通讯控制转矩运行 4、状态灯与报警信息 一、伺服电机的…

金融行业AI大模型百项应用案例综述【大模型系列】

逐浪金融大模型的玩家&#xff0c;除了BAT、华为等高科技巨头&#xff0c;试图以技术优势充当产业链的“卖铲人”&#xff0c;更多的还是金融和类金融企业&#xff0c;包括银行、保险、互金、券商等&#xff0c;既不想被喧宾夺主&#xff0c;又不想肥水外流&#xff0c;都在押注…

确保WEB应用安全:深入分析与有效防范

目录 前言 一. 概述 二. WEB应用体系结构脆弱性分析 1.前端用户界面 2.后端服务器 3.数据库 4.风险和后果 5.缓解措施 三. SQL注入攻击及防范 1.使用参数化查询或预定义语句 2.输入验证和转义 3.最小化数据库权限 4.使用存储过程和预定义语句 5.保持软件更新 6.实…

【Linux系统化学习】网络套接字(编写简单的TCP服务端和客户端)

目录 TCP服务端 创建套接字 解决绑定失败问题 填充网络信息 绑定 设置监听状态 接受请求 收取和反馈消息 完整的服务端封装代码 TCP客户端 创建套接字 填充网络信息 发起连接 发送和收取消息 客户端完整代码 一些补充 TCP服务端 初始化服务端 创建套接字 和U…

【JAVA项目】基于个人需求和地域特色的【外卖推荐系统】

技术简介&#xff1a;采用B/S架构、ssm 框架、Java技术、MySQL等技术实现。 系统简介&#xff1a;统权限按管理员&#xff0c;商家和用户这三类涉及用户划分。(a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;首页&#xff0c;个人中心&#xff0c;用户管理…

C++ | Leetcode C++题解之第61题旋转链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* rotateRight(ListNode* head, int k) {if (k 0 || head nullptr || head->next nullptr) {return head;}int n 1;ListNode* iter head;while (iter->next ! nullptr) {iter iter->next;n…

ctfshow web入门 sql注入 web201--web208

web201 先扫描先 python .\sqlmap.py -u "http://4863661d-2371-4812-ae62-128fadbdc0a4.challenge.ctf.show/api/?id" --user-agentsqlmap 加头 python .\sqlmap.py -u "http://4863661d-2371-4812-ae62-128fadbdc0a4.challenge.ctf.show/api/?id" --u…

每日算法之从前序与中序遍历序列构造二叉树

题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: &#xfffc; 输入: preorder [3,9,20,15,7], inorder [9,3,15,20,7] 输出: […

央视影音 视频下载 2

浏览器猫抓插件&#xff0c;拿到视频地址&#xff0c;这个地址的播放不正常&#xff0c;花屏。https://dh5.cntv.qcloudcdn.com/asp/h5e/hls/2000/0303000a/3/default/6edd15a0ebb3467993bec51a95be0e22/2000.m3u8 改一下地址&#xff0c;把代码中的h5e去掉。网址改为https://…

Wezterm的安装和简单配置

配置文件 进入 C:\Users\xxx 目录&#xff0c; 创建 .wezterm.lua 配置内容 wezterm 默认用 cmd.exe, 我是 win11&#xff0c;希望默认用 powershell。 希望 wezterm 的主题配色&#xff0c;保持和 powershell 默认配色一致&#xff0c;也就是 Compell 主题。 目的是在频繁…

基于springboot+vue+Mysql的自习室预订系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【centos】vmware安装airflow流程

文章目录 1.下载系统https://mirrors.aliyun.com/centos/7/isos/x86_64/ 选择DVD20092.在VMware中&#xff0c;除了修改安装位置&#xff0c;其它选择默认安装centos73.用户名为root,登录4.网络适配器为桥接模式。5.使用命令消除显示器警告。6.安装anaconda6.1下载包&#xff1…