linux操作系统启动之前,首先是硬件上电, BIOS,然后是主引导加载程序等。
我们从上电开始说起直到init进程。
启动第一部分:从系统上电到进入linux操作系统。
第二部分:linux操作系统开始初始化到启动init进程。
第一部分:
1.系统上电之后,会从0xffff,fff0处取指令。在0xffff,fff0地址处是一个跳转指令,通过此指令,CPU跳转到BIOS(位于ROM中)开始运行BIOS程序。
2.BIOS程序分两个部分:其一主要做自检工作,这个工作叫做POST(power on self test),这部分工作主要是检查硬件,其中有显卡,内存和系统总线,其中PCI的设备枚举过程就是在此完成的。例如没有键盘的话,会在此检查出来,并有提示。
2.1其一部分是:读入“引导块”。通过BIOS设置的引导顺序(“引导顺序”这个大家都很明白吧,就是从哪儿启动,一般是硬盘启动,安装系统时从光盘启动),依次从硬盘,光盘,软驱中读入“引导块”。此引导块是第一扇区的512个字节。一般来说都是从硬盘中读出此“引导块”并保存到RAM中,此时CPU从BIOS跳转到主引导加载程序。
3.主引导加载程序:
主引导加载程序的工作是查找并加载次引导加载程序(第二阶段)。它是通过在分区表中查找一个活动分区来实现这种功能的。当找到一个活动分区时,它会扫描分区表中的其他分区,以确保它们都不是活动的。当这个过程验证完成之后,就将活动分区的引导记录从这个设备中读入 RAM 中并执行它。
4.次引导加载程序:
次引导加载程序(第二阶段引导加载程序)可以更形象地称为内核加载程序。这个阶段的任务是加载 Linux 内核和可选的初始 RAM 磁盘。
在 x86 PC 环境中,第一阶段和第二阶段的引导加载程序一起称为 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。
5.启动操作系统。(当然也可以是windows系统)
在此启动的第一部分完成,开始运行操作系统,注意以上过程全部使用实地址模式。
以硬盘启动为例
1. 开机
2. BIOS 加电自检 ( Power On Self Test -- POST ) 内存地址为 0FFFF : 0000
3. 将硬盘第一个扇区 (0头0道[柱面]1扇区,也就是Boot Sector) 读入内存地址0000 : 7C00 处.
4. 检查(WORD) 0000 : 7DFE 是否等于0xAA55,若不等于则转去尝试其它启动介质
如果没有其它启动介质则显示"No ROM BASIC" 然后死机.
5. 跳转到0000 : 7C00 处执行MBR 中的程序.
6. MBR 首先将自己复制到 0000 : 0600 处, 然后继续执行.
7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动分区或有不止一个活动分区, 则转停止.
8. 将活动分区的第一个扇区读入内存地址 0000 : 7C00 处.
9. 检查(WORD) 0000 : 7DFE是否等于0xAA55,若不等于则显示"Missing Operating System"然后停止,或尝试软盘启动
10. 跳转到0000 : 7C00处继续执行特定系统的启动程序.
11. 启动系统 ...
以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10步由MBR中的引导程序完成.
更详细的介绍:
http://www.ibm.com/developerworks/cn/linux/l-linuxboot/