开机过程中的cpu 到底在运行哪些指令?

不知道你想过没有,当我们按下开机键后,CPU到底在运行哪些指令?这是我们每天都在做的事情,虽然感觉开机过程非常简单,但其实背后的原理却很复杂。尽管书本上用几句话概括了开机过程中的细节,比如BIOS接管、硬盘被读取和内存被映射等等,这些细节却让很多人感到困惑。今天,我要给你讲讲开机这一过程中到底发生了什么。我们从最简单的三个概念开始:内存是数据仓库,给出一个地址就能取出对应数据;CPU就像是永动机一样不断从内存中取出指令并执行;PC寄存器指向哪条指令,CPU就执行哪条指令。理解这三点后,我们就能把开机过程中的所有“魔法”都拆成普通代码。 开机瞬间,CPU的PC寄存器被强行设置为0xFFFF0。那这个地址是怎么来的呢?其实是内存映射的结果。实模式下的内存空间是根据地址总线宽度决定的:16位机只能寻址1MB,32位机可以寻址4GB。但是系统不会把整个空间都分配给内存,一部分会被显卡、硬盘控制器等外设占用。这些外设的寄存器被映射到内存中的某个区间里,所以当CPU读这些地址时就像是在读写外设一样。BIOS就把自己的代码段映射到了C0000到FFFFF这段区域里。所以当PC指向0xFFFF0时,CPU就会从这里开始执行BIOS的代码。 从BIOS开始执行以后呢?这就好比是接力赛了。首先CPU会从0xFFFF0开始执行初始化操作。接下来它会跳转到f000:e05b这个地址去执行另一个程序片段。这个新程序会进行硬件检测、建立中断向量表,并且按顺序读取硬盘中的启动区数据。如果硬盘启动区末尾的两个字节是0x55和0xAA的话,BIOS就会把这部分数据复制到内存中的0x7c00位置,然后再次跳转过去。这时候启动区代码就开始运行了。 启动区代码的作用是什么呢?它其实就是一个过渡性的程序片段,只有512字节大小,干不了太多事情。它的任务是把真正的内核代码加载到内存中去,并且让PC指针指向这个内核入口的地址。一旦完成跳转,系统就完全接管了控制权,BIOS的任务也就结束了。 总结一下:开机过程中PC指针指向FFFF0时BIOS接管;然后通过jmp far f000:e05b把控制权交给新程序;新程序运行完毕后把控制权交给启动区;最后启动区代码把控制权交给真正的内核。剩下的故事就是分页、中断、驱动和文件系统等等内容了。 如果你对这个过程感兴趣的话,可以尝试写一个“Hello World”程序放在磁盘第一扇区里面,并且自己制作一个启动盘来测试一下。当你看到屏幕上显示出“Hello World”的时候你就会明白操作系统是如何诞生的了。