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

系列文章目录

第二十章 QEMU系统仿真设置完成后开放轮询的分析



前言

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

3. resume_mux_open()

函数 resume_mux_open() 在 /chardev/mux.c 文件中,定义如下:

void resume_mux_open(void)
{
    muxes_opened = true;
    object_child_foreach(get_chardevs_root(),
                         chardev_options_parsed_cb, NULL);
}

get_chardevs_root()

函数 get_chardevs_root() 定义如下:

Object *get_chardevs_root(void)
{
    return container_get(object_get_root(), "/chardevs");
}

chardev_options_parsed_cb()

函数 chardev_options_parsed_cb() 定义如下:

static int chardev_options_parsed_cb(Object *child, void *opaque)
{
    Chardev *chr = (Chardev *)child;

    if (!chr->be_open && CHARDEV_IS_MUX(chr)) {
        open_muxes(chr);
    }

    return 0;
}
open_muxes()

函数 open_muxes() 在 /chardev/char-mux.c 文件中,定义如下:

/**
 * Called after processing of default and command-line-specified
 * chardevs to deliver CHR_EVENT_OPENED events to any FEs attached
 * to a mux chardev. This is done here to ensure that
 * output/prompts/banners are only displayed for the FE that has
 * focus when initial command-line processing/machine init is
 * completed.
 *
 * After this point, any new FE attached to any new or existing
 * mux will receive CHR_EVENT_OPENED notifications for the BE
 * immediately.
 */
static void open_muxes(Chardev *chr)
{
    /* send OPENED to all already-attached FEs */
    mux_chr_send_all_event(chr, CHR_EVENT_OPENED);

    /*
     * mark mux as OPENED so any new FEs will immediately receive
     * OPENED event
     */
    chr->be_open = 1;
}

函数 mux_chr_send_all_event() 定义如下:

void mux_chr_send_all_event(Chardev *chr, QEMUChrEvent event)
{
    MuxChardev *d = MUX_CHARDEV(chr);
    int i;

    if (!muxes_opened) {
        return;
    }

    /* Send the event to all registered listeners */
    for (i = 0; i < d->mux_cnt; i++) {
        mux_chr_send_event(d, i, event);
    }
}

函数 mux_chr_send_event() 定义如下:

static void mux_chr_send_event(MuxChardev *d, int mux_nr, QEMUChrEvent event)
{
    CharBackend *be = d->backends[mux_nr];

    if (be && be->chr_event) {
        be->chr_event(be->opaque, event);
    }
}

总结

以上分析了 QEMU 系统仿真在启动过程中,QEMU系统仿真通知字符设备后端驱动开始工作的代码部分。

在完成此动作后,QEMU 程序回到主循环,并开始等待轮询的事件处理。

相关推荐

  1. QEMU系统分析启动)】

    2024-04-27 05:56:04       34 阅读
  2. QEMU系统分析启动五)】

    2024-04-27 05:56:04       28 阅读
  3. QEMU系统分析启动一)】

    2024-04-27 05:56:04       36 阅读
  4. QEMU系统分析启动七)】

    2024-04-27 05:56:04       35 阅读
  5. QEMU系统分析启动八)】

    2024-04-27 05:56:04       34 阅读
  6. QEMU系统分析启动九)】

    2024-04-27 05:56:04       32 阅读
  7. QEMU系统分析实例)】

    2024-04-27 05:56:04       29 阅读
  8. QEMU系统分析实例)】

    2024-04-27 05:56:04       33 阅读
  9. QEMU系统分析实例五)】

    2024-04-27 05:56:04       25 阅读
  10. QEMU系统分析实例七)】

    2024-04-27 05:56:04       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 05:56:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 05:56:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 05:56:04       87 阅读
  4. Python语言-面向对象

    2024-04-27 05:56:04       96 阅读

热门阅读

  1. 前端补充20

    2024-04-27 05:56:04       24 阅读
  2. centos上网卡突然找不到了

    2024-04-27 05:56:04       32 阅读
  3. 怎样实现由.ui文件生成的.py文件的逻辑分离?

    2024-04-27 05:56:04       30 阅读
  4. CentOS7.9环境下安装mysql-8.0.32详解

    2024-04-27 05:56:04       31 阅读
  5. 四级英语之词类的确定

    2024-04-27 05:56:04       34 阅读
  6. C语言——通讯录实现

    2024-04-27 05:56:04       30 阅读