本文仅简单介绍Linux的启动过程,在此基础上做简要的分析。对于Linux启动过程中内部详细的函数调用不做介绍,只是希望本文能给新手起到一个抛砖引玉的作用,以便深入研究Linux的启动过程。下图基本展示了Linux启动的基本过程,仅为个人学习总结得出,如有大神拍砖,表示欢迎。

一. BIOS自检:

  应当理解的一些常识:

    BIOS的组成是由两大部分组成的:POST(power on system test)代码和运行时的服务;

    POST的工作目的是对硬件进行检测;

1. 当计算机加电后,首先由BIOS进行POST(power on system test)自检。

即第一步骤就是加电,POST自检。然后依据BIOS内设置的引导顺序从硬盘,软盘,或CDROM中读入引导块;

2. BIOS的第二个步骤是进行本地设备的枚举和初始化。

通常Linux系统都是从硬盘上引导的,其中主引导目录(MBR)中包含着主引导目录加载程序,MBR是一个512字节大小的扇区,位于磁盘上的一个扇区。     即:每个磁盘的第一个扇区为磁盘的MBR,MBR中前446字节记录的是boot loader,boot loader中安装的是grub的stage1,用于指向grub主程序咋磁盘中的位置。开机加电之后,BIOS按照boot sequence找到对应磁盘,然后搜索该磁盘的MBR。找到位于基本磁盘分区的grub程序,即进入stage2阶段,按照grub.conf配置文件对kernel以及initrd进行引导加载。当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR。

查看MBR中的内容:(前提是root用户)

 dd if=/dev/sda of=mbr.bin bs=512 count=1

 od –xa mbr.bin

查看到的内容为(均为二进制):

二.启动GRUB/LILO

GRUB和LILO都是引导加载程序,主要用于引导操作系统的启动。

在单一的MBR中只能存储一个操作系统的引导记录,所以当需要多个操作系统时,就会出现问题,需要更灵活的引导加载程序。

GRUB和LILO的区别:

      GRUB拥有交互式命令界面;

      GRUB支持网络引导;

      LILO可以引导操作系统位置的信息存储在MBR中;

*:如果LILO的配置文件出现错误,会导致系统无法启动;而当使用GRUB时,如果配置文件出现错误,则系统会默认转到GRUB命令界面。

GRUB的配置文件:  /boot/grub/grub.config

像上图一样,输入 cat grub.conf 之后,按下Enter键:

三.加载内核:

加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个可压缩的内核映像。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压缩,然后将其放入高端内存中。如果有初始化RAM磁盘映像,系统就会将它移动到内存中,并标明以后使用,然后到该例程会调用内核,并开始启动内核引导的过程。

四. 执行init进程

init进程是系统所有进程的起点,是所有进程的发起者和控制者。因为在任何基于Linux的操作系统中,它都是第一个运行的进程,所以,init进程的进程编号(PID)永远是1.

内核在完成核内引导以后,即在本进程空间内加载init程序,它的进程号是1,主要用来执行一些开机初始化脚本和监视进程。如:init读取系统引导配置文件/etc/inittab中的信息进行初始化。

关于init进程的作用:

  1. 扮演终结父进程的角色:因为init进程永远不会终止,所以系统总是可以确认它的存在,并在必要的时候以它为参照;
  2. 在进入某个特定的运行级别时,运行相应的程序,以及对各种运行级别进行管理,它的这个作用由文件/etc/inittab定义的。

五. 关于其它

  /etc/rc.d/rc.sysinit  系统初始化脚本;

  /etc/rc.d/rcX.d/[KS] * - 根据运行级别X分配服务;终止以“K”开头的服务,启动以“S”开头的服务;

  /etc/rc.d/rc.local 执行本地特殊配置;

  最后是其他服务。

    作者:itRed

    博客URL:http://www.cnblogs.com/itred

    学习交流邮箱:it_red@sina.com

本博客您可以自由转载,但请保留原作者信息和文章链接URL。

推荐参考阅读:

《6 Stages of Linux Boot Process (Startup Sequence)》 http://www.thegeekstuff.com/2011/02/linux-boot-process/

《Linux Booting Process》http://resources.infosecinstitute.com/linux-booting-process/

Linux 启动过程分析的更多相关文章

  1. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  2. linux启动过程分析

    参考:http://blog.chinaunix.net/uid-26495963-id-3066282.html http://www.comptechdoc.org/os/linux/startu ...

  3. X86架构下Linux启动过程分析

    1.X86架构下的从开机到Start_kernel启动的整体过程 这个过程简要概述为: 开机-->BIOS-->GRUB/LILO-->Linux Kernel 其执行的流程图和重要 ...

  4. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...

  5. [转载] Linux启动过程详解-《别怕Linux编程》之八

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket.为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. = ...

  6. Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

    一.系统的启动(各历史节点) 在最开始的时候,计算机的启动实际上依靠一段二进制码,可以这么理解,他并不是一个真正的计算机启动一道程序.计算机在开始加电的时候几乎是没有任何用处的,因为RAM芯片中包括的 ...

  7. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  8. Linux系统启动过程分析

    [原创]Linux系统启动过程分析-wjlkoorey258-ChinaUnix博客http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对 ...

  9. 【转】Linux系统启动过程分析

    [转]Linux系统启动过程分析 转自:http://blog.chinaunix.net/uid-23069658-id-3142047.html 经过对Linux系统有了一定了解和熟悉后,想对其更 ...

随机推荐

  1. CocoaPods的版本升级

    我们在项目开发过程中为了更好的管理项目中引用的一些第三方的开源代码,我们在项目开发中都会使用CocoaPods,在项目中不使用Cocoapods可以绕过这篇帖子,但是Cocopods升级比较快,但是怎 ...

  2. Backpropagation反向传播算法(BP算法)

    1.Summary: Apply the chain rule to compute the gradient of the loss function with respect to the inp ...

  3. Android和Linux应用综合对比分析

    原文地址:http://www.cnblogs.com/beer/p/3325242.html 免责声明: 当时写完这篇调查报告,给同事看了后,他觉得蛮喜欢,然后想把这篇文章修改一下,然后往期刊上发表 ...

  4. Guava 并行 Futures实例

    Future可以用来构建复杂的异步操作,方法不是返回一个值,而是一个Future对象.创建Future对象的过程(比如调用Future异步函数接口),不会阻塞当前线程操作,而且对象第一个次创建没有值, ...

  5. JS、LUA都可以开发移动应用

    蓝色互动,大众点评.韩都衣舍.汉庭.携程旅游.华夏基金.中国农业银行等好多知名APP开发商,正在使用, 领先的快速移动应用开发平台 http://www.deviceone.net?00001 应用开 ...

  6. TCP Server—Linux

    #include <stdio.h> #include <netinet/ip.h> #define BUFF_SIZE 1024 int main(int argc,char ...

  7. [PCB制作] 1、记录一个简单的电路板的制作过程——四线二项步进电机驱动模块(L6219)

    前言 现在,很多人手上都有一两个电子设备,但是却很少有人清楚其中比较关键的部分(PCB电路板)是如何制作出来的.我虽然懂点硬件,但是之前设计的简单系统都是自己在万能板上用导线自己焊接的(如下图左),复 ...

  8. 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)

    当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...

  9. python Web开发框架-Django (1)

    以前用web.py(另外一款轻量级web开发框架)做一个监控管理平台,没有做特别的记录就不好拾起来.最近做一个日志聚合系统,使用的是django,这次就记下来,方便查询. Django是一个高效的we ...

  10. Git学习笔记(2)——版本的回退,和暂存区的理解

    本文主要记录了版本的回退,以及工作区,暂存区概念的理解. //开始之前,先回顾上次的内容,修改文件如下,并提交到版本库. Git is a distributed version control sy ...