首页 > 代码库 > X86下Linux的启动过程
X86下Linux的启动过程
简介
1、系统加电复位阶段
2、BIOS启动、自检
3、加载MBR主引导程序
4、加载GRU次引导程序
5、加载操作系统内核
6、运行操作系统的第一个进程init
第一步、系统加电复位阶段
系统加电或复位后,基于80x86的特性,中央处理器将内存中所有数据清零,并对内存进行校验。如果没有错误,则CS寄存器中全部置1,IP寄存器中全部置0,即CS=FFFF[0]H,而IP=0000[0]H。[CS]:[IP]指向的就是BIOS的入口,由此进入BIOS的启动过程。
在系统加电启动过程中,实际上只有一个CPU(BSP--启动CPU)负责启动工作,而其它的CPU(AP--非启动CPU)则处于中断屏蔽状态,等待着操作系统的激活。
第二步、BIOS(basic input/output system,基本输入输出系统)启动、自检
BIOS调用Bootloader来把操作系统的内核映像加载到系统RAM中。
X86计算机在启动后首选会进行BIOS的加电自检,检测计算机的硬件设备,然后按照CMOS设置的顺序搜索处于活动状态并且可以引导的设备。
引导设备可以是软盘、光驱、USB设备、硬盘设置是网络上的某个设备。
(1)、当PC的电源打开后,80x86架构的cpu将自动进入实模式,并从地址0xFFFF0000(CS:0xFFFF,IP:0x0000)开始自动执行程序代码,这个地址通常是BIOS的地址。
(2)、BIOS的首先进行POST(Power On Self Test即加电后自检),检测系统中一些关键设备是否存在和能否正常工作,例如内存和显卡等设备。此时显卡还没有初始化,如果发现了一些致命错误,例如没有找到内存或者内存有问题(此时只会检查640K常规内存),BIOS会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。
(3)、然后物理地址0处开始初始化中断向量(注意:这个BIOS的中断向量很重要,后边的很多和硬盘等的交互都是通过此中断向量完成的)。
第三步、加载MBR(master boot record,主引导记录)
BIOS将启动设备的第一个扇区(第0磁道第一个扇区被称为MBR即主引导记录,它的大小是512字节,里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA),读入内存绝对地址0x7C00处,并跳转到这个地址并执行。其实被复制到物理内存0x7C00处的内容就是Boot Loader,对于较早的内核不靠grub启动的,它就是bootsect.S程序,而对于现在PC多数使用grub引导启动的,就是lilo或者grub了。
主引导加载程序的任务就是查找并加载保存在硬盘分区上的次引导加载程序(GRUB),它通过分区表查找活动分区,然后将活动分区的次引导加载程序从设备读入内存中并运行,进入引导加载程序的第二阶段。
第四步、加载GRUB(多重操作系统启动管理器)
又称为次引导加载程序,这个阶段的任务是加载Linux内核。一旦次引导加载程序被加载到内存中后,便会显示GRUB的图形界面,在该界面中用户可以通过上下方向键选择需要加载的操作系统以及它们的内核
GRUB是GRand Unified Bootloader的缩写,它是一个多重操作系统启动管理器。
GRUB是现在Linux使用的主流的引导程序,当然现在的GRUB不仅仅是能引导Linux系统,对于Winodows、Mac OS、BSD等几乎所有系统它都能引导。
GRUB的一些相关配置文件都是保存在了 /boot/grub 这个目录下
GRUB是当前linux诸多发行版本默认的引导程序。嵌入式系统上,最常见的bootloader是U-BOOT。这样的bootloader一般位于MBR的最前部。在linux系统中,bootloader也可以写入文件系统所在分区中。比如,grub程序就非常强大。 Gurb运行后,将初始化设置内核运行所需的环境。然后加载内核镜像。
grub磁盘引导全过程:
(1)stage1、grub读取磁盘的第一个512字节的主引导记录MBR。
(2)stage1.5、识别各种不同的文件系统格式,目的是为了grub能识别到文件系统。
(3)stage2、加载系统引导菜单(/boot/grub/menu.lst或grub.lst),加载内核vmlinuz和RAM磁盘initrd。
grub的配置:
GRUB的配置主要通过修改/boot/grub/目录下的grub.conf文件来完成,用户可以通过VI或者在图形界面中使用文件编辑工具打开该文件进行编辑。
(1)default选项
(2)timeout选项
(3)splashimage选项
(4)hiddenmenu选项
(5)title选项
(6)root (hdx,y)
(7)kernel选项
第五步、加载操作系统的内核
启动GRUB去加载操作系统的内核,Linux系统的内核都是存放在/boot目录下
内核映像文件vmlinuz:包含有linux内核的静态链接的可执行文件,传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。其构成包括:
当用户选择启动Linux操作系统后,GRUB会根据/boot/grub.conf配置文件中所设置的信息,从/boot/所在的分区上读取Linux内核映像,然后把内核映像加载到内存中并把控制权交给Linux内核。Linux内核获得控制权后,将会按以下步骤继续引导系统。
(1)内核映像首先会检测系统中的硬件设备,包括内存、CPU、硬盘等,对这些设备进行初始化并配置。
(2)内核映像是经过压缩的,接下来它要对自身进行解压,同时加载必要的设备驱动。
(3)初始化与文件系统相关的虚拟设备,如LVM或者软件RAID等。
(4)装载根文件系统(/),把根文件系统挂载到根目录下。
(5)完成引导后,Linux内核会在其进程空间内加载init程序,并把控制器交给init进程,由init进程继续完成接下来的系统引导工作。
第六步、运行操作系统上的第一个进程 init
init进程是Linux系统所有进程的起点,内核在完成内核引导后,便会加载init进程,其进程号是1。init进程启动后,会初始化操作系统,并启动特定的运行级别(Runlevel)下的自动运行程序。用户可以通过更改相关的配置文件或使用图形化配置工具“服务配置”,自定义需要在系统启动时自动运行的服务。
一、init进程简介
内核映像在完成引导后,便会启动init进程。init进程对应的执行文件为/sbin/init,它是系统中所有进程的发起者和控制者,所有的进程都是由它所衍生。如果init进程出现问题,系统中的其他进程也会随之而受影响。
1.作为所有进程的父进程参照对象
2.运行不同级别的程序
二、 init进程的引导过程
当init进程获得控制权后,它首先会执行/etc/rc.d/rc.sysinit脚本,根据脚本中的代码配置环境变量、配置网络、启用Swap、检查并挂载文件系统、执行其他系统初始化所必须的步骤等。
X86下Linux的启动过程