QEMU开发新的架构,网上有很多介绍QEMU的文章,大部分都是讲TCG二进制翻译的与执行流程的。
QEMU的目录结构中target*都是各种ARCH,有ARM,MIPS,X86等等。
QEMU模拟一个架构都是分为用户态与系统态,所以,我们要加入系统态(全系统模拟)与用户态这两部分。
系统态就是全系统模拟,你可以执行相应的ARCH的二进制程序。用户态提供了在host端执行目标代码的机制。
当然假设我们有一个新的架构为XX,
那么我么就首先要对target*目录里的文件进行分析,看看都需要哪些重要的操作与过程。
首先以MIPS为例,cpu.c cpu.h cpu-qom.h dsp_helper.c gdbstub.c helper.c helper.h kvm.c kvm_mips.h lmi_helper.c machine.c Makefile.objs mips-defs.h msa_helper.c op_helper.c translate.c translate_init.c,这么多文件, 但是如果基本可以运行起来的话 只需要先加入 cpu.h cpu.c helper.c
helper.h op_helper.c translate.c translate_init.c 这几个是最主要的文件。
cpu.h定义了有关CPU的基本信息,包括定点,浮点寄存器,特殊寄存器,还有各种宏表示,需要的各种参数等。
cpu.c实现了cpu的初始化,reset,还有其他一些功能。
helper.c 中主要实现了内存管理,异常处理等操作。
op_helper.c 中实现了一些很难用QEMU内部代码翻译的指令,主要有特殊指令,浮点指令,甚至是向量指令等。
translate.c 实现了target的指令翻译,以便能够在host上运行
translate_init.c 定义了处理的型号参数设定等。
到这里就基本知道有哪些内容了,所以在添加一个新的架构时,需要了解哪些内容。 首先你要对设计的架构非常熟悉,包括系统结构, 指令动作,功能,内存管理,等等。
对于QEMU你就要根据设计哪部分 就需要把哪部分搞明白才行。 例如内存管理这一块,你就要了解QEMU的内存管理的实现,和使用方法,如果有cache, TLB等,要如何操作。 要实现指令翻译就要了解QEMU的TCG二级制翻译这一块和算术指令异常处理过程,浮点的异常处理过程等。
后续会以一个架构具体实现说明添加过程, 这个是我刚工作时做的,已经过去快四年了,可能一些方面说的不太对,希望多交流,有疑问的可以提出。