<http://www.cnblogs.com/vamei/archive/2012/09/05/2672039.html>参考
当我们打开计算机电源
第一步:计算机会自动从主板的BIOS(Basic Input/Output System)读取其中所存储的程序(BIOS是主板上自带的一块存储器,里边烧录了固定的基本输入输出系统,不是由自己定义)。这个BIOS程序会自动检测主板上各个接口的状态,也就是是否连接了相应的设备(硬盘,网络接口,键盘,串口,并口)。现在大部分的BIOS允许你从软盘、光盘或者硬盘中选择一个来启动计算机。
第二步:计算机将从你所选择的存储设备(硬盘或者USB等)中读取起始的512 bytes(这是存储设备的第一个扇区,计算机系统默认会自动去读取第一个扇区)。这512 bytes的存储会存放两种信息,第一分区表,第二引导程序,在BIOS检测完计算机的硬件状态以后会将执行权限交给这里的引导程序,引导程序存放的是操作系统内核存放的真实位置,可以理解为操作系统的选择列表(多操作系统的时候),储存有操作系统(OS)的相关信息,比如操作系统名称,操作系统内核 (kernel)所在位置等。常用的boot loader有GRUB和LILO。
随后,boot loader会帮助我们加载kernel。kernel实际上是一个用来操作计算机的程序,它是计算机操作系统的内核,主要的任务是管理计算机的硬件资源,充当软件和硬件的接口。操作系统上的任何操作都要通过kernel传达给硬件。Windows和Linux各自有自己kernel。狭义的操作系统就是指kernel,广义的操作系统包括kernel以及kernel之上的各种应用。这里要注意:不管是BIOS还是BootLoader在执行完自己的职责以后都会将控制权交给接下来的那个程序,自己可以说是完全消失了在了内存。最终引导到内核以后整个计算机系统的操作权限就有kernel控制。
实际上,我们可以在多个分区安装bootloader(从主引导分区引导到其他的引导程序),每个bootloader对应不同的操作系统,在读取MBR的时候选择我们想要启动的bootloader。这就是多操作系统的原理。
在底层,驱动会为kernel,硬件,高层应用等提供接口,对于kernel而言,她则是整个系统的一个调度系统,不管是什么硬件或软件,只要按我的接口标准定义相应的高层逻辑就行,kernel仅仅关心调度,并不关心硬件或者软件的实现
不同的linux系统所应用的都是一样的kernel,因为在底层的调度类似没有必要重新开发,他们的不同主要是高层应用的差距
从BIOS-->MBR-->bootloader-->kernel-->init。。。。每一次转换都是一次整个硬件系统的接管,后者接管则前边的系统退出。kernel完成之后就是init,init是linux的第一个进程1号进程,linux没有0号进程
小结:BIOS -> MBR -> boot loader -> kernel