【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

相关文章

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Nginx启动失败:端口80被占用问题的解决方案

《Nginx启动失败:端口80被占用问题的解决方案》在Linux服务器上部署Nginx时,可能会遇到Nginx启动失败的情况,尤其是错误提示bind()to0.0.0.0:80failed,这种问题通... 目录引言问题描述问题分析解决方案1. 检查占用端口 80 的进程使用 netstat 命令使用 ss

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

springboot启动流程过程

《springboot启动流程过程》SpringBoot简化了Spring框架的使用,通过创建`SpringApplication`对象,判断应用类型并设置初始化器和监听器,在`run`方法中,读取配... 目录springboot启动流程springboot程序启动入口1.创建SpringApplicat