系列文章目录
第十八章 QEMU系统仿真的加速器上电后设置分析
文章目录
- 系列文章目录
- 第十八章 QEMU系统仿真的加速器上电后设置分析
- 前言
- 一、QEMU是什么?
- 二、QEMU系统仿真的启动分析
- 1.系统仿真的初始化代码
- 2.主循环数据初始化
- 3. accel_setup_post(current_machine)
- 总结
前言
本文以 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 虚拟机导出信息的设置,接下来将处理预配置的工作,本篇文章将完成以下代码部分的分析。
2.主循环数据初始化
这部分代码在 system/vl.c 文件中,实现如下:
void qemu_init(int argc, char **argv)
{
...accel_setup_post(current_machine);
...
}
3. accel_setup_post(current_machine)
此函数在 /accel/accel-system.c 文件中,定义如下:
void accel_setup_post(MachineState *ms)
{AccelState *accel = ms->accelerator;AccelClass *acc = ACCEL_GET_CLASS(accel);if (acc->setup_post) {acc->setup_post(ms, accel);}
}
函数 acc->setup_post() 根据不同的加速器,有不同的实现,以 XEN 加速器为例,其实现在 /accel/xen/xen-all.c 文件中,定义如下:
static void xen_setup_post(MachineState *ms, AccelState *accel)
{int rc;if (xen_domid_restrict) {rc = xen_restrict(xen_domid);if (rc < 0) {perror("xen: failed to restrict");exit(1);}}
}
函数 xen_restrict() 定义如下:
static inline int xen_restrict(domid_t domid)
{int rc;rc = xentoolcore_restrict_all(domid);trace_xen_domid_restrict(rc ? errno : 0);return rc;
}
总结
以上分析了 QEMU 系统仿真在启动过程中,QEMU系统仿真上电后加速器设置的代码部分。