了解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 ...
随机推荐
- 你应该知道Go语言的几个优势
要说起GO语言的优势,我们就得从GO语言的历史讲起了-- 本文由腾讯技术工程官方号发表在腾讯云+社区 2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Grie ...
- gulp.src()内部实现探究
写在前面 本来是想写个如何编写gulp插件的科普文的,突然探究欲又发作了,于是就有了这篇东西...翻了下源码看了下gulp.src()的实现,不禁由衷感慨:肿么这么复杂... 进入正题 首先我们看下g ...
- linux AB web 性能测试工具
ab(选项)(参数) 选项 -A:指定连接服务器的基本的认证凭据: -c:指定一次向服务器发出请求数: -C:添加cookie: -g:将测试结果输出为“gnuolot”文件: -h:显示帮助信息: ...
- Python_汇总生成统计报表
import xlrd import xlwt from xlutils.copy import copy objWb = xlrd.open_workbook(r'C:\Users\IBM\Desk ...
- leetcode刷题笔记172 阶乘后的零
题目描述: 给定一个整数 n,返回 n! 结果尾数中零的数量. 示例1: 输入: 输出: 解释: ! = , 尾数中没有零. 示例2: 输入: 输出: 解释: ! = , 尾数中有 个零. 说明: 你 ...
- 二叉树 c++
树 非空树 有一个(root)根节点r 其余节点可分为m个互不相交的有限集(子树)T1....Tm 具有n个节点的树,具有(n-1)条连接(指针域),需要构成结构体,尽可能减少空间域的浪费,使用儿子兄 ...
- abcdocker 的博客
技术参考总结 abcdocker 的博客 09月 3 篇 20日 Centos7 图形化创建KVM 10日 Nginx 代理Google 进行*** 10日 mac 安装装逼神器cmatrix 08月 ...
- win7+opencv3.0.0+vs2010 安装及配置
最近看<学习opencv>,想要跑人脸识别的例子,于是先配环境吧. 1. opencv下载: 具体下载地址,http://opencv.org/,官网太慢,百度网盘的资源链接:http: ...
- LeetCode 633. 平方数之和
题目: 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c. 示例1: 输入: 5 输出: True 解释: 1 * 1 + 2 * 2 = 5 示例2 ...
- ns3的输入输出奥秘(一) LOGGING系统
1.LOGGING系统 (1)在我们之前对C++的理解,输出好像就是cout,然而 以myfirst.cc为例子 在我们前面的编写的代码中并没有出现cout,那他是如何输出. 可以回忆一下 LogCo ...