- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Bochs_cpu的
Bochs代码导读
摘要
Bochs是一个基于LGPL的开源x86虚拟机软件,它是用C++编写的。Bochs的工作方式与VMWare等软件有所不同,VMWare是直接在实体机器的CPU上执行虚拟机的CPU指令,而Bochs则是用一个个函数来模拟一条条指令。于是,VMWare的性能比较好,但它只能在x86机器上模拟x86;而Bochs则可以在各种架构的CPU上模拟x86,当然,它的性能比较低。
本文站在一个开发人员的角度,深入浅出地介绍Bochs 2.2.6的一些重要的类,函数以及大致的工作流程,以分析CPU的模拟代码为主,不涉及BIOS、磁盘、显卡等的模拟。
1 主要的类
1.1 BX_CPU_C
在bochs.h里面有一个宏:
#define BX_CPU_C bx_cpu_c
因此BX_CPU_C类实际上表示的是bx_cpu_c类,这个类用于模拟一个CPU,它可以模拟16位(实模式)、32位(保护模式)和64位(长模式)三种模式,这三种模式的区别主要是寄存器的字长不同。下面简单介绍这个类的主要成员。
char name[64];
name变量是一个字符串,代表CPU的名字。
unsigned bx_cpuid;
CPU的ID号,Bochs可以模拟SMP(对称多处理)的机器,在SMP机器中,每个CPU都有一个ID号来彼此区分。
bx_gen_reg_t gen_reg[BX_GENERAL_REGISTERS];
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_REGISTERS值为16时通用寄存器分别是RAX、RCX、RDX、RBX、RSP、RBP、RSI、RDI、R8~R15;值为8时没有R8~R15。
Bit64u rip; Bit32u eip;
rip和eip分别是64位模式和32位模式下的指令指示器,其类型分别是64位和32位的无符号整数。
bx_address prev_eip; bx_address prev_esp;
为了处理指令的执行异常或失效问题,提供prev_eip和prev_esp以保存上一条指令的IP(指令指示器)和SP(堆栈指示器)。bx_address的类型是Bit64u或Bit32u,取决于模拟的是64位还是32位CPU。
bx_segment_reg_t sregs[6];
bx_segment_reg_t是表示段寄存器的结构,sregs[6]是表示了6个段寄存器的数组。这6个寄存器分别是ES、CS、SS、DS、FS和GS。
BX_MEM_C *mem;
mem是指向这个CPU所使用的内存的指针。
bx_local_apic_c local_apic;
在SMP系统中,需要用到APIC(高级可编程中断控制器),每个处理器都有一个本地APIC,用于接收本CPU产生的中断以及CPU之间的中断,整个系统中还有一个IO APIC,用于接收外部硬件产生的中断。bx_local_apic是表示本地APIC的类,local_apic就是处理器的本地APIC。
unsigned cpu_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_c iCache BX_CPP_AlignN(32);
iCache表示CPU的指令缓存,其存储方式按32字节对齐。
BX_CPU_C(unsigned id = 0); ~BX_CPU_C();
构造函数和析构函数。构造函数的主要工作是为成员变量分配相应的存储空间,设置bx_cpuid和local_apic的值。
void initialize(BX_MEM_C *addrspace);
CP
文档评论(0)