接前一篇文章: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参数项为例简单分析参数的处理过程。