了解Linux操作系统的引导过程
原文地址:http://os.51cto.com/art/200706/49690.htm
1.简介
Linux启动过程指的是从加电到看到shell提示的这一段时间。
Linux启动的过程可以大概分为几个个阶段,具体划分为几个阶段则依靠具体的系统实现。一般来说,基于X86架构的系统可以分为3个阶段;一些嵌入式的系统有的分为两个阶段,有的分为3个阶段。
很多介绍linux系统启动的文章对细节部分都描述的不清楚,那就让我来详细的说一下吧,如果由错误,请多包含了:)
2. 启动过程之上电与加载引导程序
无论是哪种系统,linux启动的第一阶段总是CPU上电初始化的阶段。
CPU在上电之后首先是自检的过程,当这个过程完成之后,CPU就会跳转到一个固定的地址,从这个地址开始执行代码。这个固定的地址根据CPU的不同而不同,比如PC中的这个地址是0XFFFF0。而这个固定的地址通常是一些只读的或者可读写的闪存,CPU通过总线和这些闪存连接,并能够通过寻址机制找到这些闪存的地址。
在普通PC中,BIOS系统是一个‘加载第一个引导程序’的系统,PC的CPU上电后执行的第一行代码总是BIOS中的闪存所保存的代码,这段代码可以看作是一个启动环境,它完成的工作有两部分:基本硬件加电检测与本地设备的枚举与初始化。当完成加电检测后,这段BIOS代码(完成加电检测的代码)会被从内存中清除,但是BIOS的系统运行时服务代码开始运行,这段代码检测CMOS的配置,其实也就是看看用户配置的从哪个设备启动,当BIOS的运行时服务代码找到用户配置的启动设备后,就从此设备中将第一个引导程序的代码拷贝到RAM中,至此,BIOS的任务顺利完成。剩下的事情交给‘第一个引导程序’来继续吧。需要注意的是这个所谓的‘第一个引导程序‘肯定保存在用户选择的设备中,并且BIOS的运行时服务代码知道这个引导程序保存的地址,要不怎么把它搞到RAM中去啊?
而在嵌入式系统中可能没有BIOS这样的系统,但是肯定也有一块类似的闪存/ROM,CPU可以从这个ROM的地址上开始执行代码,而这段代码肯定是一个启动环境,也就是一段特殊的程序了,比如U-BOOT什么的。这段程序肯定保存在闪存的固定位置,要不您让CPU怎么找?这段程序干什么呢?它们提供了将Linux系统映象下载到闪存并继续执行的方法,除了可以存储并引导Linux映象之外,这些程序还可能执行一定级别的系统测试和硬件初始化过程。嵌入式系统的这段启动环境代码就类似与PC中的‘第一个引导程序’代码,也就是和硬盘MBR中包含的主引导程序类似。
在PC Linux启动中,当BIOS发现是由硬盘引导系统后,就找到此硬盘的MBR,将MBR中保存的引导程序加载到RAM中,然后将CPU的控制权交给MBR中的这段代码,BIOS的任务到此算是全部完成了。所以说,BIOS从上电到现在忙活了大半天,主要目的就是为了找到引导设备,并将引导设备的引导程序加载到RAM中来运行。BIOS好人啊!
3.第一阶段引导程序
MBR中的代码就是所谓的‘第一阶段引导程序’。
它分为三个部分,第一部分是真正的代码,即BootLoader代码部分,就是一段可执行的代码;第二部分是一个64字节的分区表,包含四个分区记录;第三部分是结束标识符(0XAA55),用来做MBR的有效性检测。
‘第一阶段引导程序’的作用是查找并加载‘第二阶段引导程序’。它通过在分区表中查找一个活动分区来实现此功能。在MBR的第二部分所标识的四个分区中,只有一个是活动分区,通常这个活动分区记录包含了真正分区的信息,Bootloader通过这个信息找到真正的分区,然后从这个分区将‘第二阶段引导程序’加载进RAM中。
4.第二阶段引导程序
第二阶段引导程序可以认为是引导过程的最后一步了,它的核心任务就是加载Linux内核与可选的初始化RAM盘。
在PC环境中,现在通常使用grub来实现引导程序。Grub相对应lilo来说一个最大的优点就是grub可以识别硬盘分区。其实在第一阶段引导程序加载第二阶段引导程序之前,第一阶段引导程序会先引导一个第1。5阶段引导程序进入RAM执行,这段代码可以理解为包含linux系统映象的特殊文件系统,当此引导程序运行后,就会加载第二阶段引导程序了。第二阶段引导程序主要是grub的工作,就是使用我们事先配置好的grub来加载相应的内核映象与初始化RAM盘到内存中。
当内核影响与初始化RAM盘加载成功后,第二阶段引导程序的任务也就胜利完成了,剩下的活都交给内核映象吧。
5.内核启动过程
当第二阶段引导程序完成任务,内核映象取得CPU控制权后,内核的旅程就开始了,终于等到这一天了!
可惜,此时的内核映象并不是一个可执行的程序,而是一个压缩过的程序,使用zlib压缩而成。其实此内核映象包括两个部分,最前端的部分是一小段的可执行代码,后面才是真正的内核映象。前端部分的主要工作是初始化少量的硬件设置,然后解压缩内核映象并将解压缩后的内核放入高端内存中。此时如果发现由初始化RAM盘,则将其移入内存中,暂时不用。然后,解压缩后的内核取得了CPU的控制权,内核开始行动了!
内核启动后,首先对页表进行初始化,并启动内存分页功能,然后检测CPU类型,然后调用start_kernel()函数,进入与体系无关的初始化部分,包括内存配置,加载初始化RAM盘,最后启动init函数,至此内核启动阶段就结束了。
了解Linux操作系统的引导过程的更多相关文章
- Linux 系统管理——引导过程与服务控制
一. 系统引导流程 1.开机自检(BIOS)(基本的输入输出系统) 2.MBR引导1.2. MBRIS 当从本机硬盘中启动系统时,首先根据硬盘第一个扇区中MBR (Master Boot Record ...
- Linux系统引导过程及排除启动故障
一.Linux操作系统引导过程二.系统初始化进程1.init进程2.Systemd3.Systemd单元类型三.排除启动类故障[1].修复MBR扇区故障(含实验过程)[2].修复GRUB引导故障●方法 ...
- Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...
- linux系统引导过程
linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序.bootsect.s.setup.s和head.s,完成引导过程后进入到main函数运行.BIOS完成硬件的检查与初始化等工 ...
- 【Linux系统引导过程】
*** 第一步 开机自检 根据主板BIOS中的启动顺序,移交系统控制权. 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它. 这是因为BIO ...
- Linux系统——引导过程与服务控制
一.Linux开机启动原理(十步) (1)开机自检BIOS 开机检测,主板检测 (2)MBR引导 硬盘512字节 (3)GRUB菜单 操作系统菜单 (4)加载内核(kernel) 启动操作系统核心,根 ...
- Linux学习笔记:系统启动引导过程
Linux系统启动引导过程 近期发现自己在仅仅是掌握上有几个比較硬的伤: 一.知识体系碎片,比方Linux,这学点那学点,结果没有成体系,串不起来: 二.记忆时间短暂,非常多的内容学了就忘,最后的结果 ...
- Linux引导过程和服务过程
目录 一.Linux操作系统引导过程 1.1.开机自检 1.2.MBR引导 1.3.GRUB菜单 1.4.加载Linux内核 1.5.init进程初始化 二.系统初始化进程 2.1.init进程 2. ...
- Linux 引导过程内幕
转载:http://www.ibm.com/developerworks/cn/linux/l-linuxboot/index.html 从主引导记录到第一个用户空间应用程序的指导 引导 Linu ...
随机推荐
- 【ORACLE】数据库空闲1分钟自动断开
-- 开启参数,创建概要文件 SQL> show parameter resource_limit; NAME TYPE ...
- JavaScript快速入门-ECMAScript本地对象(Date)
JavaScript中的Date 对象用于处理日期和时间. var myDate=new Date() #Date 对象会自动把当前日期和时间保存为其初始值. 一.Date对象的方法 方法 示例 n ...
- 软件测试_测试工具_Loadrunner_IP欺骗
一.设置IP欺骗的原因: 1.当某个IP的访问过于频繁或者访问量过大时,服务器会拒绝访问请求: 2.某些服务器配置了负载均衡,使用同一个IP不能测出系统的实际性能.Loadrunner中的IP欺骗通过 ...
- 揭秘memset与sizeof的结合使用方法
memset与sizeof为什么经常结合起来用呢? 一.memset介绍 memset函数是C++中的一个函数,它将从给定地址开始,逐个字节刷内存,初始化它们为给定的参数. 基本用法: void * ...
- PAT甲题题解-1095. Cars on Campus(30)-(map+树状数组,或者模拟)
题意:给出n个车辆进出校园的记录,以及k个时间点,让你回答每个时间点校园内的车辆数,最后输出在校园内停留的总时间最长的车牌号和停留时间,如果不止一个,车牌号按字典序输出. 几个注意点: 1.如果一个车 ...
- php OPcache
众所周知php是一种解释型语言,它的执行可分为如下几个流程: Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens) Parsing, 将Tokens转换成简单而有意义的表达式 ...
- 第一周:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
姓名:吕松鸿 学号:20135229 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...
- navicat连接mysql报10061错
可能原因:mysql服务未启动 解决办法:进入到计算机管理,找到服务,然后找到mysql服务,并启动该服务
- Data Plane
2015-2018,部分关于SDN数据平面的故障恢复文献粗读 SHEAR: A highly available and flexible network architecture marrying ...
- 团队作业4--第一次项目冲刺(Alpha版本)日志集合处
第一次 http://www.cnblogs.com/p-12/p/7861231.html 第二次 http://www.cnblogs.com/p-12/p/7861835.html 第三次 ht ...