生活中我们往往以为的理所应当有时却不是那么平常,比如boot,平时说到计算机启动,都会提到boot,而boot的英文意思是靴子,跟计算机的启动怎么会联系起来呢。
事实上,boot作为启动的意思来源于
pull oneself over a fence by one′ sbootstraps
话说从前有一个人陷入泥潭,但他却用靴子后面的拉环将自己从泥潭里拉了出来,你能想象螺旋升天的场景吗。
这故事本身听起来不可思议,但它所描述的过程却恰与计算机的启动过程相似,因为想要启动计算机必须运行程序,而想要运行计算机必须先启动计算机,仿佛想要启动一台计算机陷入了一个死循环,那么事实上计算机是怎么启动的呢?
相比人类世界运作的复杂,PC的运行过程及其简单,就是不断重复
这样的周期,但是想要进入这个周期却并不容易。
就像有了光才有了生命的开始,在你加电的那一刻PC世界才开启。
主板上电后,由于电压尚未稳定,有一块控制芯片告诉CPU先不要急,先进行初始化,也就是"reset", 待电压稳定后,控制芯片撤销"reset",CPU就急不可耐得去执行他人生的第一条执行,当然指令是被存储在存储介质中,实际上就是一个地址,在Intel的x86架构下,这个地址为0xFFFFFFF0,至于为什么是这个地址,涉及的层面就比较高了,我们就先不聊了。
说到地址,有人可能就想到那不就是内存吗。可是这个地址还真不是内存中的地址,因为此时内存还没被初始化呢,这个地址是BIOS芯片里的一个地址。
想要有地址,首先就得编址,就像你家门牌号,是由管理国土规划的人来编址,而cpu就像是国土局的人,给存储介质一字节一字节得划好了地址,cpu编地址有两种方式,一种是统一编址,比如我在内存中划出一块区域专门作为与外设交互的地址,一个超明显的例子就是显存,以Intel的x86架构为例,0xB8000就是显存的地址,你往这个地址下写字符就是能在显示器上显示出来,从这个地址开始,每两个字节被解释为显示在屏幕上的一个字符,这第一个字节表示要显示字符的字模码,就是一个字符的像素点应该怎么点出来,第二个字节用于表示这个字符的前景色和背景色。具体如下
我们再说回计算机启动的事,等到控制芯片撤销"reset"命令后,cpu便进入BIOS上的上电自检程序(Power On Self Test),比如检查一下内存硬盘能不能正常访问啊,总线上跑数据网卡连接有没有问题啊,当cpu检查这些都没有问题后,他就觉得他行了,此时cpu就去找所有软件的大哥-操作系统,至于去哪里找,就要根据BIOS上的一张设备启动顺序表,对,就是你进入BIOS后能自己设置从硬盘或者u盘启动的那张表。
cpu会根据表上存储介质的顺序,去读每一个存储介质的第一个扇区,即512个字节,假如这个存储介质的最后两个字节是0x55和0xAA,那么cpu认为操作系统就在这块存储介质里,于是开始加载操作系统,并不再去检查后面的设备。
cpu会将存储介质上的第一个扇区的512字节加载到内存的0x7C00处,紧接着开始从0x7C00执行指令,由于512字节大小有限(如果够大的话我直接把操作系统的代码放在这),所以只够我们将操作系统的引导程序放在这里,这段代码由于意义特殊,我们一般把它叫做bootloader程序。
一般单操作系统电脑来说bootloader就是把操作系统内核引导到内存里,但是GNU推出GRUB帮助我们在bootloader阶段来选择一个操作系统进入,以便适应现在操作系统众多的环境。
以上就是关于boot的整个过程,其实就是检查引导这样一个简单节奏,但其中涉及的细节问题却十分复杂,这里所提到的也只是皮毛而已。想了解更多就去把《计算机的奥秘》《体系结构》啥的整起来吧。