欢迎来到天天文库
浏览记录
ID:27596010
大小:101.50 KB
页数:9页
时间:2018-12-05
《Bochs代码导读 - Welcome to SCTS & CGCL!.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Bochs代码导读摘要Bochs是一个基于LGPL的开源x86虚拟机软件,它是用C++编写的。Bochs的工作方式与VMWare等软件有所不同,VMWare是直接在实体机器的CPU上执行虚拟机的CPU指令,而Bochs则是用一个个函数来模拟一条条指令。于是,VMWare的性能比较好,但它只能在x86机器上模拟x86;而Bochs则可以在各种架构的CPU上模拟x86,当然,它的性能比较低。本文站在一个开发人员的角度,深入浅出地介绍Bochs2.2.6的一些重要的类,函数以及大致的工作流程,以分析CPU的模拟代码为主,不涉及BIOS、磁盘、显卡等的模拟。1主要的类1.1BX_CPU_C在boc
2、hs.h里面有一个宏:#defineBX_CPU_Cbx_cpu_c因此BX_CPU_C类实际上表示的是bx_cpu_c类,这个类用于模拟一个CPU,它可以模拟16位(实模式)、32位(保护模式)和64位(长模式)三种模式,这三种模式的区别主要是寄存器的字长不同。下面简单介绍这个类的主要成员。charname[64];name变量是一个字符串,代表CPU的名字。unsignedbx_cpuid;CPU的ID号,Bochs可以模拟SMP(对称多处理)的机器,在SMP机器中,每个CPU都有一个ID号来彼此区分。bx_gen_reg_tgen_reg[BX_GENERAL_REGISTERS];
3、bx_gen_reg_t是一个比较复杂的结构体,它表示一个64位的通用寄存器,其主要成员有:rrx:表示一个完整的64位寄存器的hrx、erx:分别表示64位寄存器的高32位与低32位,这时候64位的寄存器被分割成2个32位寄存器使用rx:表示erx的低16位,此时寄存器被当作16位寄存器使用rh、rl:分别表示rx的高8位与低8位,此时rx被分割成2个8位寄存器gen_reg就是一个代表通用寄存器的数组,BX_GENERAL_REGISTERS是寄存器的个数,如果模拟的是64位处理器,那么BX_GENERAL_REGISTERS值为16,否则值为8。当BX_GENERAL_REGISTE
4、RS值为16时通用寄存器分别是RAX、RCX、RDX、RBX、RSP、RBP、RSI、RDI、R8~R15;值为8时没有R8~R15。Bit64urip;Bit32ueip;rip和eip分别是64位模式和32位模式下的指令指示器,其类型分别是64位和32位的无符号整数。bx_addressprev_eip;bx_addressprev_esp;为了处理指令的执行异常或失效问题,提供prev_eip和prev_esp以保存上一条指令的IP(指令指示器)和SP(堆栈指示器)。bx_address的类型是Bit64u或Bit32u,取决于模拟的是64位还是32位CPU。bx_segment_r
5、eg_tsregs[6];bx_segment_reg_t是表示段寄存器的结构,sregs[6]是表示了6个段寄存器的数组。这6个寄存器分别是ES、CS、SS、DS、FS和GS。BX_MEM_C*mem;mem是指向这个CPU所使用的内存的指针。bx_local_apic_clocal_apic;在SMP系统中,需要用到APIC(高级可编程中断控制器),每个处理器都有一个本地APIC,用于接收本CPU产生的中断以及CPU之间的中断,整个系统中还有一个IOAPIC,用于接收外部硬件产生的中断。bx_local_apic是表示本地APIC的类,local_apic就是处理器的本地APIC。un
6、signedcpu_mode;CPU的工作模式,主要有5种,分别是实模式(16位模式)、8086虚拟模式(32位模式下虚拟16位模式)、保护模式(32位模式)、兼容模式(64位模式下虚拟32位模式)和长模式(64位模式)。分别使用宏BX_MODE_IA32_REAL、BX_MODE_IA32_V8086、BX_MODE_IA32_PROTECTED、BX_MODE_LONG_COMPAT和BX_MODE_LONG_64表示。bxICache_ciCacheBX_CPP_AlignN(32);iCache表示CPU的指令缓存,其存储方式按32字节对齐。BX_CPU_C(unsignedid=
7、0);~BX_CPU_C();构造函数和析构函数。构造函数的主要工作是为成员变量分配相应的存储空间,设置bx_cpuid和local_apic的值。voidinitialize(BX_MEM_C*addrspace);CPU的初始化函数,它的主要工作是初始化本地APIC,为各个寄存器赋初值,并且将addrspace的值赋给mem。BX_CPP_INLINEbx_boolreal_mode(void);BX_CPP_INL
此文档下载收益归作者所有