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

server/2024/9/23 12:20:15/

系列文章目录

第十九章 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系统仿真上电后宿主系统相关设置的代码部分。


http://www.ppmy.cn/server/21420.html

相关文章

SpringCloud系列(10)--Eureka集群原理及搭建

前言&#xff1a;当注册中心只有一个&#xff0c;而且当这个注册中心宕机了&#xff0c;就会导致整个服务环境不可用&#xff0c;所以我们需要搭建Eureka注册中心集群来实现负载均衡故障容错 Eureka架构原理图 1、Eureka集群原理 2、创建Eureka Server端服务注册中心模块 (1)在…

Oracle Hint 语法详解

什么是Hint Hint 是 Oracle 提供的一种 SQL 语法&#xff0c;它允许用户在 SQL 语句中插入相关的语法&#xff0c;从而影响 SQL 的执行方式。 因为 Hint 的特殊作用&#xff0c;所以对于开发人员不应该在代码中使用它&#xff0c;Hint 更像是 Oracle 提供给 DBA 用来分析诊断问…

HTTP和HTTPS的区别及HTTPS的工作原理

一、HTTP和HTTPS的区别 1、安全性 HTTP:HTTP是明文传输的&#xff0c;这意味着数据在传输过程中不加密&#xff0c;容易受到中间人攻击。敏感信息&#xff0c;如密码和信用卡号&#xff0c;如果通过HTTP传输&#xff0c;可能会被窃取。HTTPS:HTTPS使用SSL(Secure Sockets Lay…

stm32-中断的使用和原理

一 什么是中断 : 轮询机制 &#xff1a;顾名思义&#xff0c;就是每轮都询问一次。比如 while 循环的每一次&#xff0c;就会执 行检查&#xff0c; 1. 此处串口是否有数据到来。 2. 每次都检测一下引脚状态 , 是否为低电 平。 本质是 while 循环每一次都把数据获取的函数或者…

分布式-知识体系

分布式系统 本质就是一堆机器的协同&#xff0c;要做的就是用各种手段来让机器的运行达到预期 分布式业务场景 分布式四纵四横说 基于 MSA&#xff08;微服务架构&#xff09;的分布式知识体系 相关概念 – 【摘自网络原文】 节点与网络 节点 传统的节点也就是一台单体的物…

接口的构成

目录 接口 一、URL 二、请求方法 三、请求报文&#xff08;request message&#xff09; 3.1请求行 3.2请求头 3.3 请求体 四、响应报文&#xff08;response message&#xff09; 4.1响应行 4.2响应头 4.3响应体 接口 接口就是API&#xff0c;是程序开发的函数和方…

BUUCTF--web(1)

1、[极客大挑战 2019]Http1 1.http报文请求&#xff1a; 1、请求行&#xff1a; 第一部分是请求方法&#xff0c;常见包括GET、POST、OPTIONS&#xff08;我目前还没有见过我是菜鸡&#xff09; 第二部分是url 第三部分是HTTP协议(http(Hypertext transfer protocol)超文本传…

盲人安全过马路:科技赋能,独立出行不再难

作为一位资深记者&#xff0c;我长期关注特殊群体的生活现状与科技助力下的改善举措。今天&#xff0c;我要讲述的是盲人朋友在独立出行&#xff0c;尤其是过马路时面临的挑战&#xff0c;以及一款叫做蝙蝠避障的创新辅助应用如何通过实时避障与拍照识别功能&#xff0c;显著提…