【QEMU系统分析之启动篇(十九)】

2024-04-27 01:04

本文主要是介绍【QEMU系统分析之启动篇(十九)】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

第十九章 QEMU系统仿真的加速器上电后设置分析


文章目录

  • 系列文章目录
    • 第十九章 QEMU系统仿真的加速器上电后设置分析
  • 前言
  • 一、QEMU是什么?
  • 二、QEMU系统仿真的启动分析
    • 1.系统仿真的初始化代码
    • 2.主循环数据初始化
    • 3. os_setup_post()
      • Windows 系统 os_setup_post()
      • POSIX 系统 os_setup_post()
        • change_root()
        • change_process_uid()
  • 总结


前言

本文以 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)
{
...os_setup_post();
...
}

3. os_setup_post()

函数 os_setup_post() 根据宿主机系统不同而不同,

Windows 系统 os_setup_post()

在 Windows 系统上此函数在 /include/sysemu/os-win32.h 文件中,定义如下:

static inline void os_setup_post(void) {}

这是一个空语句,表示在 Windows 平台上不需要做额外操作。

POSIX 系统 os_setup_post()

在 POSIX 系统上此函数在 /os-posix.c 文件中,定义如下:

void os_setup_post(void)
{int fd = 0;if (daemonize) {if (chdir("/")) {error_report("not able to chdir to /: %s", strerror(errno));exit(1);}fd = RETRY_ON_EINTR(qemu_open_old("/dev/null", O_RDWR));if (fd == -1) {exit(1);}}change_root();change_process_uid();if (daemonize) {uint8_t status = 0;ssize_t len;dup2(fd, 0);dup2(fd, 1);/* In case -D is given do not redirect stderr to /dev/null */if (!qemu_log_enabled()) {dup2(fd, 2);}close(fd);do {        len = write(daemon_pipe, &status, 1);} while (len < 0 && errno == EINTR);if (len != 1) {exit(1);}}
}

在 POSIX 系统中,需要做后台化处理,并完成标准输入输出设备的重定向。

change_root()

函数 change_root() 在 /os-posix.c 文件中,定义如下:

static void change_root(void)
{if (chroot_dir) {if (chroot(chroot_dir) < 0) {error_report("chroot failed");exit(1);}if (chdir("/")) {error_report("not able to chdir to /: %s", strerror(errno));exit(1);}}}
change_process_uid()

函数 change_root() 在 /os-posix.c 文件中,定义如下:

static void change_process_uid(void)
{assert((user_uid == (uid_t)-1) || user_pwd == NULL);assert((user_uid == (uid_t)-1) ==(user_gid == (gid_t)-1));if (user_pwd || user_uid != (uid_t)-1) {gid_t intended_gid = user_pwd ? user_pwd->pw_gid : user_gid;uid_t intended_uid = user_pwd ? user_pwd->pw_uid : user_uid;if (setgid(intended_gid) < 0) {error_report("Failed to setgid(%d)", intended_gid);exit(1);}if (user_pwd) {if (initgroups(user_pwd->pw_name, user_pwd->pw_gid) < 0) {error_report("Failed to initgroups(\"%s\", %d)",user_pwd->pw_name, user_pwd->pw_gid);exit(1);}} else {if (setgroups(1, &user_gid) < 0) {error_report("Failed to setgroups(1, [%d])",user_gid);exit(1);}}if (setuid(intended_uid) < 0) {error_report("Failed to setuid(%d)", intended_uid);exit(1);}if (setuid(0) != -1) {error_report("Dropping privileges failed");exit(1);}}
}

总结

以上分析了 QEMU 系统仿真在启动过程中,QEMU系统仿真上电后宿主系统相关设置的代码部分。

这篇关于【QEMU系统分析之启动篇(十九)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/939136

相关文章

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

Linux下在线安装启动VNC教程

《Linux下在线安装启动VNC教程》本文指导在CentOS7上在线安装VNC,包含安装、配置密码、启动/停止、清理重启步骤及注意事项,强调需安装VNC桌面以避免黑屏,并解决端口冲突和目录权限问题... 目录描述安装VNC安装 VNC 桌面可能遇到的问题总结描js述linux中的VNC就类似于Window

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Oracle修改端口号之后无法启动的解决方案

《Oracle修改端口号之后无法启动的解决方案》Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系... 目录一、问题根源分析​​​二、保姆级解决方案​​​​步骤1:修正监听器配置文件 (listener.

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地