揭秘计算机开机第一指令:内存空白下的执行策略

5星 · 超过95%的资源 需积分: 44 35 下载量 184 浏览量 更新于2023-07-02 1 收藏 37KB DOC 举报
当计算机开机时,第一条指令的执行是一个关键过程,因为这决定了系统的初始化流程。首先,需要理解的是,尽管内存(RAM)通常用于存储程序和数据,但它并非永恒存在且易丢失信息。在早期的8086时代,由于内存容量较小(1MB),BIOS(基本输入输出系统)的固件指令被固化在ROM(只读存储器)中,以便在启动时保持稳定性。ROM被分配在内存的最后64KB区域(地址0xFFFF0),这样可以避免与RAM重叠,同时保证指令的执行不会干扰正常内存操作。 8086时代的启动代码以跳转指令的形式开始,跳转到内存地址0xF000:FFF0H。这个偏移量可以根据实际需要调整,目的是优化地址空间的使用,避免浪费。由于地址空间安排在内存末尾,它不会影响整个地址范围的连续性。 然而,随着80386处理器的出现,内存容量扩大,将BIOS固件继续放在F000h段可能导致地址空间被分割,造成不便。Intel解决这个问题的方法是保持BIOS ROM的传统位置——在系统可寻址空间的最后,比如在32位x86系统中,这位于4GB地址空间的尽头。在系统复位时,CPU切换到实模式,将CS(代码段寄存器)设置为F000h,同时它的shadow register(影子寄存器)Base设为FFFF0000h(Intel故意将高12位设置为1,以达到更高的地址),EIP(指令指针寄存器)设为0000FFF0h。 这样,BIOS固件的物理地址实际上变成了FFFFFFF0h。虽然BIOS代码需要保持向后兼容,但执行的第一条指令仍然是一个远跳转指令,跳转到地址F000:E05B(具体值可能会因BIOS版本不同而变化)。这个跳转指令不仅更新了CS寄存器,还将它设置回F000h,这是为了恢复正常的代码执行路径。 总结来说,计算机开机第一条指令的执行涉及到CPU与内存、BIOS固件之间的交互,通过精心设计的地址映射和寄存器设置,确保了系统能够正确启动并进入正常的运行状态。随着硬件的进步,这种机制也在不断演变以适应新的硬件需求和地址空间管理。