QEMU源码全解析4 —— QEMU参数解析(4)

接前一篇文章:QEMU源码全解析3 —— QEMU参数解析(3)

本文内容参考:

《趣谈Linux操作系统》 —— 刘超,极客时间

《QEMU/KVM》源码解析与应用 —— 李强,机械工业出版社

特此致谢!

本回讲解QemuOpt结构的具体定义以及QemuOptsList、QemuOpt、QemuOpts等结构之间的关系。

前文提到,每个QEMU子选项由一个QemuOpt结构表示。QemuOpt结构在include/qemu/option_int.h中定义,代码如下:

struct QemuOpt {
    char *name;
    char *str;

    const QemuOptDesc *desc;
    union {
        bool boolean;
        uint64_t uint;
    } value;

    QemuOpts     *opts;
    QTAILQ_ENTRY(QemuOpt) next;
};

name表示子选项的字符串表示;str表示对应的值。

QEMUOptsList并不和QemuOpt直接联系,中间还有一层QemuOpts。从名字上也能看出来,QemuOpts代表的是多个QemuOpt。为什么需要QemuOpts?这是因为QEMU命令行可以指定创建两个相同的设备,此时这类设备都在QemuOptList链表上,这是两个独立的QemuOpts,每个QemuOpts有自己的QemuOpt链表。QemuOpts结构的定义也在include/qemu/option_int.h中(这个文件中就struct QemuOpt和struct QemuOpts两个定义),代码如下:

struct QemuOpts {
    char *id;
    QemuOptsList *list;
    Location loc;
    QTAILQ_HEAD(, QemuOpt) head;
    QTAILQ_ENTRY(QemuOpts) next;
};

head是QemuOpts下的QemuOpt链表头;next用来连接相同QemuOptsList下同一种QemuOpts。

QemuOptsList、QemuOpts与QemuOpt三者的关系如下图所示(注:图中最上边一行的qemu_smp_opts在新版本中已经不存在了):

在这里插入图片描述

QemuOptsList、QemuOpts、QemuOpt三者关系图

本文就介绍到这里,下一篇文章会以-device参数项为例简单分析参数的处理过程。

猜你喜欢

转载自blog.csdn.net/phmatthaus/article/details/131649115
今日推荐