CPU也是一种设备,因此CPU类继承自Device类。CPU这种设备相比其他设备来说种类非常繁杂。首先,CPU有着不同的架构,而对于每一种架构的CPU来说,随着时间的推移,CPU厂商也会给该架构的CPU不断地增加新特性和更新换代,这种更新换代造成该架构的CPU也有了各种不同的CPU模型。
以x86 CPU为例,QEMU中可以支持的CPU的模型就包括以下几种,我们可以通过qemu-system-x86_64 -cpu ?命令查看QEMU支持的X86 CPU类型。其中一些CPU模型是QEMU自己定义的,另外一些类型则是直接来自厂商。其中host类型是指将物理机上的CPU特性全部暴露给虚拟机,这样可以全面发挥CPU的性能,但是另一方面,由于全部特性被暴露给虚拟机,会造成具有不同特性的CPU架构或CPU模型的物理机之间动态迁移虚拟机会变得不可靠。
如此众多的CPU架构、CPU模型,而CPU架构、CPU模型天然具有父类和子类的关系。使用面向对象编程模型对它们进行设计是再合适不过了。但是目前对于X86CPU中不同的CPU模型(其他的架构没有仔细看),QEMU只是使用一个描述X86CPU定义的数据结构的数组来表示的。QEMU的代码注释中说明,未来要将所有的CPU模型最终定义为X86CPU的子类。
本文档向大家介绍QEMU中CPU类的设计,以及具体的X86CPU数据结构的实现。
所有CPU的基类
要定义所有CPU的基类,需要定义CPU的类的数据结构和CPU的对象的数据结构,然后给对应的TypeInfo中的函数指针赋值即可。其中CPU类的数据结构名为CPUClass、CPU对象的数据结构名为CPUState,它们被定义在include/qom/cpu.h中,而对应的TypeInfo的赋值工作则在qom/cpu.c中进行。这里只说明CPUClass、CPUState数据结构。
CPUClass
CPUClass的数据结构如下,其中最主要的内容,是与CPU相关的大量的回调函数,通过给这些回调函数的指针赋值,对应的CPUState就可以调用这些函数实现相应的功能。
CPUState
CPUState是CPU对象的数据结构,一个CPUState就表示一个虚拟机的CPU。在QEMU中,任何CPU的操作的大部分都是对以CPUState形式出现的CPU来进行的。
与CPU相关的全局变量
与CPU相关的重要全局变量,一个是全局cpus,它的定义如下。它保存了虚拟机中所有的CPUState的指针,用于对CPU的集中管理。代码在exec.c中。
另一个是在线程内的全局变量,它的定义如下:
它用于给CPU线程指示当前的CPUState的指针。方便调用CPUClass中的相关回调函数对当前的CPUState进行管理。
X86 CPU的设计
作为一种架构的CPU,X86 CPU类继承自CPU的基类,对应的类和对象的数据结构,分别是X86CPUClass和X86CPUState。
X86CPUClass
X86CPUClass是X86CPU类的数据结构,定义在target-i386/cpu-qom.h中
在target-i386/cpu.c中定义了X86CPUDefinition类型的数组,其中包含了包括qemu64、phenom等不同的X86CPU模型。读者可以自行查看。
X86CPU
X86CPU是x86架构CPU的对象的数据结构,定义在target-i386/cpu-qom.h中
CPUX86State数据结构保存了X86CPU中所有寄存器的状态,也包括段寄存器、通用寄存器、标志寄存器等,也包括FPU等浮点寄存器,以及与KVM状态相关的信息。该数据结构很长,这里不再列出,读者可以在target-i386/cpu.h中自行查看。
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/5748.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~