图解linux启动过程
概述
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 的有效性检查。
第二阶段引导载入程序
次引导载入程序(第二阶段引导载入程序)能够更形象地称为内核载入程序。
这个阶段的任务是载入 Linux 内核和可选的初始 RAM 磁盘。
GRUB 阶段引导载入程序
/boot/grub 文件夹中包括了 stage1、stage1.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启动过程的更多相关文章
- Linux启动过程详解(inittab、rc.sysinit、rcX.d、rc.local)
启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬 ...
- Linux启动过程详解
Linux启动过程详解 附上两张图,加深记忆 图1: 图2: 第一张图比较简洁明了,下面对第一张图的步骤进行详解: 加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的 ...
- 嵌入式Linux启动过程中的问题积累
嵌入式Linux启动过程中的问题积累 Dongas 07-12-19 1.Bad Magic Number ## Booting image at 33000000 ... Bad Magic Num ...
- [linux 整理] linux启动过程3
本文介绍linux启动过程的第三步 busybox--------------------> rc init busybox位置即内容 busybox/init/init.c 1.各种设置信号 ...
- 从Linux启动过程到android启动过程
Linux启动过程: 1.首先开机给系统供电,此时硬件电路会产生一个确定的复位时序,保证cpu是最后一个被复位的器件.为什么cpu要最后被复位呢?因为 如果cpu第一个被复位,则当cpu复位后开始运行 ...
- Linux启动过程简述
Linux启动过程: 图片来自:https://www.cnblogs.com/codecc/p/boot.html 简单来讲: 加载BIOS–>读取MBR–>Boot Loader–&g ...
- Linux 启动过程详解
目录 1. Linux启动过程 2. 启动过程概述 3. 引导加载阶段 4. 内核阶段 4.1 内核加载阶段 4.2 内核启动阶段 5. 早期的用户空间 6. 初始化过程 6.1 SysV init ...
- 转-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)加 ...
- Linux启动过程笔记
Linux启动过程 1.启动流程(BIOS->MBR:Boot Code->引导GRUB->载入内核->运行init->runlevel) 2./boot/grub/下有 ...
随机推荐
- Want to archive tables? Use Percona Toolkit’s pt-archiver--转载
原文地址:https://www.percona.com/blog/2013/08/12/want-to-archive-tables-use-pt-archiver/ Percona Toolkit ...
- docker中发布springboot
http://note.youdao.com/noteshare?id=81a603b1b33731aaef7b7755c70f33fb
- CSS笔记 - fgm练习 2-7 - 简易选项卡
练习地址 http://www.fgm.cc/learn/lesson2/07.html <style> body,ul,li{margin:0;padding:0;} body{font ...
- 【Codeforces Round #433 (Div. 2) C】Planning
[链接]h在这里写链接 [题意] 让你确定ti,使得∑(ti-i)*gi最小,其中ti∈[k+1..k+n],且每个ti都不能一样. 且ti>=i必须成立. [题解] 分解一下成为∑ti*gi ...
- C语言创建删不掉的目录
上一篇博客写了一个杀不死的进程,如今再写一个删不掉的目录(文件同理),所谓删不掉不是真的删不掉而是删掉后立即又一次创建. 代码例如以下: #include <stdio.h> #inclu ...
- 4、C++快速入门2
1.抽象类 如果一个类里面有纯虚函数,其被编译器认为是一个抽象类,抽象类不能用来实例化一个对象 纯虚函数定义:virtual void 函数名(void)= 0; 抽象类是给派生类定义好接口函数,如 ...
- [Debug] Use Snippets to Store Behaviors in Chrome DevTools
Using the Snippets tab in the source devtool you can define and run arbitrary pieces of code in your ...
- get_slave_status.py
#!/usr/bin/env python#-*- encoding: utf8 -*- import mysql.connectorimport get_mysql_conn_info &qu ...
- stm32的APB1和APB2时钟
要学会看官方例子,还要查找官方程序...
- Java 学习(20):Java Applet 基础 & Java 文档注释
-- Java Applet 基础 -- Java 文档注释 Java Applet 基础 Applet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Ja ...