计算机是如何启动的
计算机是如何启动的呢?
要启动一台计算机,必须要让启动程序先运行,机器才能随之启动。然而通常又是,只有在机器启动后,程序才能运行,这本身就是自相矛盾的。pull oneself up by one`s bootstrap,也就是某人通过自己的鞋带将自己拉起来,也显然是不可能的。
所以必须实现一个机制,让操作系统还未运行的时候,就注入一段启动程序在内存中运行,这就是BIOS程序。当你点击电源按钮后,CPU会自动寻址到0xFFFF0,然后读取BIOS程序到内存中执行,BIOS会进行硬件自检,即检查计算机硬件是否正常,如果一切正常,BIOS会进入下一个启动程序,然而它并不知道该启动程序在哪里,可能在磁盘上,也可能在U盘中,也有可能通过网卡获取,所以需要用户自己选择,计算机默认会选择第一个(通常是磁盘),当然这个顺序是可以调整的,这就是Boot Sequence。
如果是从磁盘启动,那么计算机会读取磁盘的第一个扇区MBR,也就是引导程序(最前面的512B,主引导记录 Master Boot Record)。
MBR由三个部分组成:
(1) 第1-446字节:调用操作系统的机器码(boot loader)。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
其中,第二部分"分区表"的作用,是将硬盘分成若干个区,因为每个区可以安装不同的操作系统。如果最后两个字节-主引导记录签名是0x55和0xAA,那么说明该设备可以启动(如果不是的话,就在Boot Sequence中依次选择下一项进行启动,例如U盘)。
如果设备可以启动,那么计算机会首先读取"主引导记录"前面446字节的机器码,运行“启动管理器”(boot loader,现在最流行的启动管理器是Grub),由用户选择启动哪一个操作系统。之后,boot loader会定位到某个特定的磁盘分区,并将操作系统内核(/boot)加载到内存,内核加载成功后,第一个运行的程序是/sbin/init,所有其他进程都是由init进程fork出来的。
![](https://images2017.cnblogs.com/blog/1102349/201708/1102349-20170827181727996-1248981093.png)