概述

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUVZVUFOR0VO/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图1 linux系统过程big view

第一阶段引导载入程序

MBR 中的主引导载入程序是一个 512 字节大小的映像,当中包括程序代码和一个小分区表(參见图 2)。前 446 个字节是主引导载入程序,当中包括可运行代码和错误消息文本。接下来的 64 个字节是分区表,当中包括 4 个分区的记录(每一个记录的大小是 16 个字节)。

MBR 以两个特殊数字的字节(0xAA55)结束。这个数字会用来进行 MBR 的有效性检查。

图2 MBR剖析

第二阶段引导载入程序

次引导载入程序(第二阶段引导载入程序)能够更形象地称为内核载入程序。

这个阶段的任务是载入 Linux 内核和可选的初始 RAM 磁盘

GRUB 阶段引导载入程序

/boot/grub 文件夹中包括了 stage1stage1.5 和stage2 引导载入程序。以及非常多其它载入程序(比如,CR-ROM
使用的是 iso9660_stage_1_5)。

关于 GRUB。非常好的一件事情是它包括了有关 Linux 文件系统的知识。GRUB 不像 LILO 一样使用裸扇区。而是能够从 ext2 或 ext3 文件系统中载入 Linux 内核。它是通过将两阶段的引导载入程序转换成三阶段的引导载入程序来实现这项功能的。

阶段 1 (MBR)引导了一个阶段 1.5 的引导载入程序,它能够理解包括 Linux 内核映像的特殊文件系统。

这方面的样例包括reiserfs_stage1_5(要从
Reiser 日志文件系统上进行载入)或 e2fs_stage1_5(要从
ext2 或 ext3 文件系统上进行载入)。当阶段 1.5 的引导载入程序被载入并执行时,阶段 2 的引导载入程序就能够进行载入了。

当阶段 2 载入之后,GRUB 就能够在请求时显示可用内核列表(在 /etc/grub.conf 中进行定义。同一时候还有几个软符号链接/etc/grub/menu.lst 和 /etc/grub.conf)。我们能够选择内核甚至改动附加内核參数。

另外,我们也能够使用一个命令行的
shell 对引导过程进行高级手工控制。

将第二阶段的引导载入程序载入到内存中之后,就能够对文件系统进行查询了。并将默认的内核映像和 initrd 映像载入到内存中。当这些映像文件准备好之后,阶段
2 的引导载入程序就能够调用内核映像了。

内核

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWUVZVUFOR0VO/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

图3 linux内核i386引导函数流程

通过调用 start_kernel。会调用一系列初始化函数来设置中断,运行进一步的内存配置,并载入初始
RAM 磁盘。最后,要调用kernel_thread(在 arch/i386/kernel/process.c 中)来启动 init 函数。这是第一个用户空间进程(user-space
process)。最后。启动空任务。如今调度器就能够接管控制权了(在调用 cpu_idle 之后)。通过启用中断,抢占式的调度器就能够周期性地接管控制权,从而提供多任务处理能力。

在内核引导过程中,初始 RAM 磁盘(initrd)是由阶段
2 引导载入程序载入到内存中的,它会被拷贝到 RAM 中并挂载到系统上。这个initrd 会作为
RAM 中的暂时根文件系统使用,并同意内核在没有挂载不论什么物理磁盘的情况下完整地实现引导。因为与外围设备进行交互所须要的模块可能是 initrd 的一部分,因此内核能够很小,可是仍然须要支持大量可能的硬件配置。在内核引导之后,就能够正式装备根文件系统了(通过 pivot_root):此时会将 initrd 根文件系统卸载掉,并挂载真正的根文件系统。

decompress_kernel 输出

函数 decompress_kernel 就是显示我们通常看到的解压消息的地方:

Uncompressing Linux... Ok, booting the kernel.

initrd 函数让我们能够创建一个小型的
Linux 内核。当中包含作为可载入模块编译的驱动程序。这些可载入的模块为内核提供了訪问磁盘和磁盘上的文件系统的方法,并为其它硬件提供了驱动程序。因为根文件系统是磁盘上的一个文件系统,因此 initrd 函数会提供一种启动方法来获得对磁盘的訪问,并挂载真正的根文件系统。在一个没有硬盘的嵌入式环境中,initrd 能够是终于的根文件系统,或者也能够通过网络文件系统(NFS)来挂载终于的根文件系统

Init

当内核被引导并进行初始化之后,内核就能够启动自己的第一个用户空间应用程序了。

这是第一个调用的使用标准 C 库编译的程序。在此之前,还没有运行不论什么标准的 C 应用程序。

在桌面 Linux 系统上,第一个启动的程序一般是 /sbin/init。可是这不是一定的。非常少有嵌入式系统会须要使用 init 所提供的丰富初始化功能(这是通过 /etc/inittab 进行配置的)。

在非常多情况下,我们能够调用一个简单的
shell 脚本来启动必需的嵌入式应用。

版权声明:本文博主原创文章。博客,未经同意不得转载。

图解linux启动过程的更多相关文章

  1. Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...

  2. Linux启动过程详解

    Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...

  3. 嵌入式Linux启动过程中的问题积累

    嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...

  4. [linux 整理] linux启动过程3

    本文介绍linux启动过程的第三步 busybox--------------------> rc init busybox位置即内容 busybox/init/init.c 1.各种设置信号 ...

  5. 从Linux启动过程到android启动过程

    Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...

  6. Linux启动过程简述

    Linux启动过程: 图片来自:https://www.cnblogs.com/codecc/p/boot.html 简单来讲: 加载BIOS–>读取MBR–>Boot Loader–&g ...

  7. Linux 启动过程详解

    目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...

  8. 转-Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)

    http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042   1)BIOS自检2)启动Grub/Lilo3)加 ...

  9. Linux启动过程笔记

    Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->载入内核->运行init->runlevel) 2./boot/grub/下有 ...

随机推荐

  1. javascript保存变量到本地文件

    最近用echarts在做可视化,好多实例都有一大堆数据,想着把数据保存到本地,有什么比较方便又可靠的办法呢? 将下边代码粘贴到浏览器的控制台 (function(console){ console.s ...

  2. 如何在anaconda中切换python2

    如果你不切换可能是默认的python3环境. 下面是在python27版本下下载qt5

  3. CSS笔记 - fgm练习 2-10 - 提示框效果 (清除子元素浮动高度塌陷的影响)

    CSS清除浮动方法参考: https://blog.csdn.net/promiseCao/article/details/52771856 <style> *{ margin: 0; p ...

  4. JS学习笔记 - 面向对象 - 原型

    <script> var arr1 = new Array(12, 55, 34, 78, 676); var arr2 = new Array(12, 33, 1) Array.prot ...

  5. 驱动学习3-make

    在向内核中添加驱动的时候要完成3项工作 (1)在Kconfig中添加新代码对应项目的编译条件(下面Makefile文件中需要用到它定义的的宏变量) (2)将驱动源码添加到对应的目录中 (3)在目录Ma ...

  6. 【例题5-4 UVA - 156】Ananagrams

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每个字符串如果每个字符按照升序排一下.假设他们能够互相变化. 则肯定是一样的. 根据这个东西,用一个map来判重就好. [错的次数] ...

  7. UIBarButtonItem使用

    1 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBar ...

  8. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  9. 2016 Java程序员的年终总结(转)

    2016 Java程序员的年终总结 技术积累 (1)代码规范 1.1.1.通常的模块分布:一般如果你要实现一个web 应用,你从后台将数据展示到前端页面,在一个比较大的公司,你少不了跟其他项目有交集( ...

  10. [Angular] Test Container component with async provider

    The main idea for testing contianer component is to make sure it setup everythings correctlly. Call ...