第0~511项: 16bit mode 内容来自www.paper51.com 第512~1023项: 32bit mode 内容来自论文无忧网 www.paper51.com (其中包括了fpu,x86-64,3DNOW,SSE等指令入口) 内容来自www.paper51.com boundaryFetch()函数(跨页边界取指) http://www.paper51.com void boundaryFetch(Bit8u*fetchPtr, unsigned remainingInPage,bxInstruction_c *i)因为指令跨页,不能将指令的首地址作为参数传给fetchDecode()/fetchDecode64(),因此设立临时变量fetchBuffer,用以保存在两页中取出的共15个字节,并将fetchBuffer作为译码的参数。指令的最大长度为15字节,但具体每条指令的长度是不定的,在本次取指过程中为了实现跨页移动了RIP,因此返回之前必须将其复原,函数返回以后,在cpu_loop()里面,会根据实际的指令长度移动RIP。 内容来自论文无忧网 www.paper51.com 3.4.3 基本内存系统 内容来自www.paper51.com
主要文件:Memory.h, Memory.cc,Misc_mem.cc 内容来自论文无忧网 www.paper51.com 主要类:bx_mem_c http://www.paper51.com 内存块基指针: 内容来自www.paper51.com Bit8u *actual_vector;//实际分配的内存块指针 copyright paper51.com Bit8u *vector; //经过对齐处理(4K大小整数倍 ) paper51.com 内存大小 内容来自www.paper51.com size_t len; //以字节为单位 copyright paper51.com size_t megabytes; //以兆字节为单位 内容来自论文无忧网 www.paper51.com
内存空间的分配如图3所示: 内容来自www.paper51.com alloc_vector_aligned(size_t bytes, size_talignment) 内容来自www.paper51.com paper51.com 图3 内存分配图 copyright paper51.com X86处理器的分页机制(相关寄器): 内容来自www.paper51.com CR0:当CR0[PG](表示CR0寄存器的PG位,下同)=1时,启用分页机制。 copyright paper51.com CR3:X86处理器通常使用多级页表,CR3中存放着最高级页表的基地址。 http://www.paper51.com CR4:当CR4[PSE]=1时,使用4M/2M大小的页面,否则使用4K大小的页面;CR4[PAE]=1时,启用PAE模式(支持36位地址空间的物理内存)。 内容来自论文无忧网 www.paper51.com |