- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
cpu模拟设计.ppt
Bochs 对CPU的模拟 2006.11 一,概述 Bochs是一个X86的模拟器,它可以模拟几乎所有类型的X86 CPU,包括16位,32位和64位(X86_64)。一个64位的X86可以看作是32位和16位X86的超集。X86_64的工作方式包括以下两类: 1,IA-32模式:包括实模式,保护模式和虚拟8086模式三个子模式。 2,IA-32e模式:包括长模式和兼容模式。 在Bochs中,用BX_CPU_C类来模拟CPU,它支持上面提到的每一种模式。 二,BX_CPU_C 类的主要数据成员 char name[64]; 代表CPU的名字。 unsigned bx_cpuid; CPU的ID号,用于SMP(对称多处理)的机器。 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。64位时通用寄存器分别是RAX、RCX、RDX、RBX、RSP、RBP、RSI、RDI、R8~R15;32位时没有R8~R15 。 BX_CPU_C 类的主要数据成员(续) Bit64u rip; Bit32u eip; 分别是64位模式和32位模式下的指令指示器。 bx_segment_reg_t sregs[6]; bx_segment_reg_t是表示段寄存器的结构,sregs[6]是表示了6个段寄存器的数组。分别是ES、CS、SS、DS、FS和GS。 BX_MEM_C *mem; mem是指向这个CPU所使用的内存的指针 。 bx_local_apic_c local_apic; bx_local_apic是模拟本地APIC的类,用于SMP系统。 unsigned cpu_mode; 就是前面提到的CPU的工作模式,主要有5种,分别是实模式(16位模式)、8086虚拟模式(32位模式下的虚拟16位模式)、保护模式(32位模式)、兼容模式(64位模式下的虚拟32位,16位模式)和长模式(64位模式)。分别使用宏BX_MODE_IA32_REAL、BX_MODE_IA32_V8086、BX_MODE_IA32_PROTECTED、BX_MODE_LONG_COMPAT和BX_MODE_LONG_64表示。 三,BX_CPU_C 类的主要函数成员 BX_CPU_C 类的主要函数成员如下: void cpu_loop(Bit32s max_instr_count) cpu_loop是一个非常重要的函数,所有的指令函数都在这里执行。参数max_instr_count表示cpu_loop执行的最大指令数。 void prefetch(void) 预取指令函数,计算指令的物理地址和其他相关信息,为后面的指令译码作准备。 unsigned fetchDecode(Bit8u *iptr, bxInstruction_c *instruction,unsigned remain) unsigned fetchDecode64(Bit8u *iptr, bxInstruction_c *instruction,unsigned remain) 这两个函数用于对指令进行译码,前者按指令长度32位译码,后者按64位译码,参数意义分别是指令的物理地址,空白指令结构和指令长度的最大字节数 void boundaryFetch(Bit8u *fetchPtr, unsigned remainingInPage, bxInstruction_c *i) X86的最长指令可以达到15个字节,因此指令可能出现跨页,此时prefetch()+ fetchDecode()/fetchDecode64()失败,必须调用boundaryFetch()函数进行跨页取指译码。 CPU工作流程:cpu_loop() 指令的关键:IP to paddr prefetch()函数(指令预取) void BX_CPU_C::prefetch(void) { 计算laddr
文档评论(0)