图解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/下有 ...
随机推荐
- 目标识别(object detection)中的 IoU(Intersection over Union)
首先直观上来看 IoU 的计算公式: 由上述图示可知,IoU 的计算综合考虑了交集和并集,如何使得 IoU 最大,需要满足,更大的重叠区域,更小的不重叠的区域. 两个矩形窗格分别表示: 左上点.右下点 ...
- Testfan软件测试社区
1. http://ask.testfan.cn/article/902 Appium 服务端安装-windows2. http://ask.testfan.cn/article/1078 最新 ...
- DC中为什么要用Uniquify?
转自:http://blog.sina.com.cn/s/blog_68c493870101exl7.html 为了在layout中进行时钟树的综合,网表在DC中必须被uniquified.所谓uni ...
- Android 自己定义主菜单
本文介绍一个超简单的自己定义主菜单.效果例如以下: 原理:事实上就是对原生的Dialog的一个简单的封装.并加上显示和隐藏的动画效果.再给控件加上回调事件. TestDialog.java publi ...
- sprinng in action 第四版第六章中的ValidationMessages.properties不起作用
文件名必须是ValidationMessages.properties,必须放在类的根目录下
- 9.12 Binder系统_Java实现_内部机制_Client端
Java实现中client端的RPC层(java实现)如何通过JNI来调用IPC层(C++实现)发送数据 TestServer通过addService向Service_manager注册的时候Test ...
- 【z07】机器翻译
[题目链接]:http://noi.qz5z.com/viewtask.asp?id=z07 [题解] 可以理解为一直往一个队列里面加东西: 然后每次查找一个东西在不在队列的最尾部长度为m的区间范围内 ...
- 【BZOJ 2119】股市的预测
[链接]h在这里写链接 [题意] 给你一个长度为n的数组a[] 设b[i] = a[i+1]-a[i]; 然后让你在b[i]里面找ABA的形式. 这里B的长度要求为m; ...
- 【JS学习】-利用谷歌浏览器调试JS代码(转)
谷歌浏览器是常用来调试JS代码的工具,本文主要介绍如何利用谷歌浏览器来调试JS代码,协助我们进行开发工作. 首先,打开谷歌浏览器,按快捷键F12或者ctrl+shift+j,就可以打开谷歌浏览器的开发 ...
- [Angular] Angular Advanced Features - ng-template , ng-container, ngTemplateOutlet
Previously we have tab-panel template defined like this: <ul class="tab-panel-buttons" ...