计算机开机第一条指令执行情况
"计算机开机第一条指令执行情况" 计算机开机第一条指令执行情况是计算机系统启动过程中的一个关键步骤。在这篇文章中,我们将探讨计算机开机第一条指令执行情况,了解CS、CSBASE的角色,并探索开机内存是空的,但从哪里获得指令,如何执行呢? 让我们来了解CPU执行第一条指令的情形。众所周知,内存是由RAM组成的,而RAM不断电,可以保存信息,一旦断电,RAM中的信息将会丢失。因此,CPU要执行的第一条指令被固化在ROM中。在以前80年代,由于内存是1M的,所以ROM被编址在1M的最后的64K中,段地址是0xFFFF0。这样就不至于将RAM分成两个部分,就是将CS设置成0XF000,CPU执行的BIOS第一条指令的地址是:0XF000:FFF0H。 然而,在80386以后,内存已经大于1M,因此如果把冷启动固件编址在F000h段内,就会把整个地址空间隔离成不连续的两段的一段是F000h以前的地址,一段是1M以后的地址,这很不方便。Intel采用的办法是,还是默认将执行启动代码的BIOS ROM编址在系统可寻址空间的最后(如32bit x86机的话,这段地址就位于4GB的最后一个64K内),在系统复位时,CPU进入实模式,并将CS寄存器设置成F000h,而将它的shadow register的Base设置成FFFF0000h(理论上正常情况下CS为F000h的话,其shadow register的Base应该设置成000F0000h,但Intel有意识的将高12位触发成1了,除了这样他也没有什么好办法让机器一启动就跑道4GB那么高的地址上去执行)。 接下来,让我们来了解BIOS代码和以前的兼容性问题。BIOS代码和以前一样,要兼容,也就是说此时从FFFFFFF0h处取出的还是一条远跳转指令jmp F000:XXXX(我跟踪调试过好几款BIOS,这里的XXXX似乎都是E05B)。问题随之而来。这个远跳转指令是要更新CS寄存器和它的shadow register的,也就是说执行这条jmp F000:E05B之後(也就是CPU执行第一条指令之后),CS将被更新成F000,其实CS原来就是这个值,这里说不上是更新,但CS的shadow register就不一样了,它被真正的更新了,它的Base域被更新成000F0000h了(高12位不再具有触发成1的功能,那个功能只在机器启动到第一次更新CS的内容期间有效)。 这个Base再加上虚拟地址中的偏移量E05B,得到物理地址000FE05Bh,这就是CPU执行的第二条指令的地址,但是这条指令的地址已经是1M以内了。但我们不要忘记,这时的F000h段内可不再是BIOS ROM了,这一段此时安排的事实上是我们的RAM空间,这一段RAM需要不需要初始化才能使用那还另说,关键是此时此刻这个地方不应该有可以执行的代码才对啊?CPU第二条指令就跳到这里不是自寻死路吗?似乎走进了死胡同,但我翻阅了很多资料,找到了一点线索。 在很久以前出现过一个叫着Chips & Technoloqies的公司,他设计出一组被称着neat的芯片组,可以将内存高端的BIOS ROM映射到1M以内的RAM空间里,并且可以使这一段被映射的RAM空间具有与ROM类似的只读属性。这个公司后来被Intel收购。但后来这种映射似乎就成为了一种标准。由于这种映射关系我们有理由相信,机器启动的时候,4G的最后一个64K里与1M的最后一个64K里应该具有相同的东西,所以即使从FFFFFFF0h用一条jmp跳到000FE05Bh,也仍然能够找到正确的代码去执行。 那么BIOS接下来要干一些什么事呢?它有很多事情要做,我只举几件有代表性的,其中有两件事是DRAM的初始化和memory sizing。按理说这个时候CPU还处在实模式下,BIOS还没有办法去确定超过1M的内存量。另外还有一件事就是代码和数据拷贝,因为映射到1M以内来的BIOS ROM容量有限,事实上还有很大一部分没有映射过来,以压缩的形式存放在高端的ROM中了,BIOS在1M以内执行初始化时难免需要将高端的那些内容拷过来使用,这也是不容易做到的。但不要忘了,我们可以使用前面...
- 粉丝: 1
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页