一个操作系统的实现笔记2:计算机的启动过程

2019-04-14 20:54发布

在我们按下电脑电源键后,发生了什么?为什么过了一会儿电脑就出现漂亮的界面,然后我们就可以操作了呢。其实我们按下电源键之后无非就是CPU上电,然后取指令执行,那么CPU刚开始上电在哪里取指令执行呢?首先X86架构CPU在上电时会从FFFF:0000地址处取得第一条指令并执行,这个地址是实模式下的地址,它会被转换成0xFFFF0,这个地址就是CPU引脚中的A0-A19,好了,CPU地址引脚输出0xffff0,但是此时内存还没有被初始化,这个地方有数据吗?其实这个地址被BIOS所映射,也就是说这个地址处放的是BIOS的代码,这里是一条跳转指令,跳转到BIOS程序处并执行,然后BIOS程序会检测一系列的硬件,如果硬件没有问题了,那么BIOS会根据用户设置的启动顺序(软盘,硬盘,光驱等)来引导操作系统,引导又是什么意思呢?其实很简单,BIOS如果发现启动设备的前512字节的最后两个字节是0x55,0xaa,就认为该设备可以启动,然后就将相应的设备中前512个字节的内容加载到内存物理地址0x7c00处,然后BIOS会跳转到0x7c00处执行操作系统自己的引导代码。这样,CPU的执行程序的过程就是:上电->跳转到BIOS进行硬件自检->复制512字节到0x7c00处->执行操作系统引导代码->进入操作系统。 计算机的启动过程我们知道了,假设我们要用U盘自己制作一个启动盘,我们就可以这样做:先写好512字节的引导程序,然后编译成CPU可执行的二进制文件,然后将这512字节的引导代码写入U盘的前512字节,然后将BIOS设置成U盘启动,这样电脑在开机就会执行我们的引导代码,然后控制权就在我们手上了,我们可以自己写一个操作系统,激动吧,本人将会写一篇《orang's一个操作系统实现读书笔记》,在这里要感谢作者于渊,读了这本书实在是受益匪浅,本来我看了X86保护模式之后想看linux0.11内核,但是发现太难了,看了前面3个引导文件(bootsect.s,setup.s,head.s)后根本找不到方向,在网上间看见了这本书,下载pdf看了一下,发现正适合我目前的水平,这本书看完了,对操作系统不仅有整体结构认识,在细节上也是有很深的了解。作者书上前面的汇编用的是nasm编译器编译,我用的是as和ld编译链接,因为对at&t汇编语法比较熟悉,其实两种都是一样的,只是写发法上有些区别,在这里再次感谢作者。