深入理解Linux启动过程


Linux系统的启动过程由很多阶段组成,这篇博客从初始化引导程序到第一个用户空间应用程序探索Linux启动进程。

我们先从Linux启动的顶层视图开始分析,以便能有一个整体的认识。

当系统第一次启动或重启的时候,处理器将执行一个已知地方的代码。对应个人电脑,这个地方是存在主板上内存内的BIOS

当一个启动设备被发现,第一阶段引导程序被加载到RAM并执行。这一部分引导程序位于512字节的MBR镜像(MBR后面会讲到),他的作用是去加载第二阶段引导程序。

当第二阶段引导程序被加载进RAM并执行,启动界面将被显示,并且Linux和可选的初始磁盘(临时文件系统)被加载进内存。当镜像被加载以后,控制权从第二阶段引导程序传递到内核镜像。

内核镜像自解压和初始化。在这一步,第二阶段引导程序将检查系统硬件,枚举硬件设备,挂载主设备,加载必须的内核模块。

当这些完成时,用户空间的第一个程序(init)开始执行,这样就开始顶层系统初始化开始了。

上面这些就仿佛是Linux启动过程的一个外壳,接下来我们开始更深层次的探索启动进程的细节。


系统启动

首先BIOS组成是:

  1. 上电自检代码
  2. 运行服务

Linux从0xffff0地址的BIOS开始启动,第一步是上电自检,上电自检的工作是检查硬件,第二步是枚举和初始化本地设备。

上电自检后,上电自检代码就从内存中被清除了,运行服务被保留并且对目标操作系统仍然有效。

要引导一个操作系统,BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备(可以是软盘,CD-ROM,硬盘的分区,网络上的设备或者U盘)。

Linux一般从MBR包含初级引导程序的硬盘启动。MBR是一个512字节的扇区,位于硬盘的第一扇区(0道0柱1扇区)。在MBR被加载到RAM中后,由BIOS去控制它。


第一阶段引导程序

初级引导程序位于512字节的MBR镜像。
MBR镜像由一个小型分区表和代码组成。

前446字节是初级引导程序代码,包括执行代码和错误信息。

接下来的64字节是一个分区表,包含4个16字节的分区记录。

MBR最后的两字节定义了一个magic数字(0xaa55)。这个magic数字用来校验检查MBR。

初级引导程序主要就是找到并且加载第二阶段引导程序。其通过分区表寻找一个活动的分区。在找到一个活动的分区表后,其将扫描剩余的分区确定它们不是活动的。当这些被确定后,活动分区的启动启动记录将从设备加载到RAM并且执行。


第二阶段引导程序

第二阶段引导程序其实叫着内核引导程序更加合适。因为其任务就是加载Linux内核和可选的初始磁盘。

随着第二阶段被加载,CRUB会根据需求显示一个可用的内核列表(定义在/etc/grub.con,以及/etc/grub/menu.lst和/etc/grub.conf的软连接)。你可以选中一个内核,并且可以用附加的内核参数改进它。

第二阶段引导程序被加载进内存后,将查询文件系统,加载默认内核镜像和initrd镜像到内存。当所有镜像准备好后,将从第二阶段跳转到内核镜像。


内核

随着内核镜像加载到内存并且从第二阶段引导程序获得控制权,内核阶段开始了。内核镜像不是一个可以执行的内核,而是一个被压缩的内核镜像。

在内核镜像的头部有一个小型程序routine,其做少量的硬件设置,然后自解压内核镜像并放到高端内存。然后routine将调用内核开始内核启动。


init进程 && 0号进程和1号进程的前世今生

init进程就是我们常说的1号进程。

说到1号进程,就不得不说一下1号进程的前世今生!!!

Linux操作系统允许一个进程去创建新进程,新进程就是子进程,从而形成了进程树的结构模型

这棵大树的树根是系统自动构造的,就是内核态下执行的0号进程,0号进程是所有进程的祖先!!

有些同学会说 那我用过pstree命令看到的树根明明是1号init进程啊。

其实这个问题很简单,咱们使用pstree去查看进程树,咱们是处在用户态去看进程,而0号进程是一个内核态进程。就像一颗大树,你能看见的只是树长在地上的东西,地底下的树根是看不见的。而1号进程就是在地上树的最底部,而0号进程是地下的树根。

整个进程创建的过程:0号进程->1号内核进程->1号用户进程(init进程)->getty进程->shell进程

我给大家画了一幅图,这幅图可以很好的让你明白这个过程。

注意:

1号内核进程调用执行init函数演变成1号用户态进程(init进程),这里前者是init是函数,后者是进程。

两者容易混淆,区别如下:

1.init()函数在内核态运行,是内核代码

2.init进程是内核启动并运行的第一个用户进程,运行在用户态下。

3.一号内核进程调用execve()从文件/etc/inittab中加载执行init函数,这个过程并没有使用调用do_fork(),因此两个进程都是1号进程。

4.孤儿进程被1号进程领养

深入理解Linux启动过程 0号进程,1号进程相关推荐

  1. Linux启动过程详细介绍

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

  2. Linux启动过程学习

    该学习过程是一个Linux从主引导记录到第一个用户空间程序的指导. 启动一个Linux系统的过程包含一系列步骤.但是无论你是启动一个标准的X86桌面或嵌入式PowerPC,大部分流程是相似的.该文章探 ...

  3. linux 启动过程

    Linux 启动过程详解 下面来详细了解一下 Linux 的启动过程.     Linux 的启动 过程包含了 Linux 工作原理的精髓,      而且在嵌入式的开发过程也非常需要这方面知识的积累 ...

  4. Linux 启动过程详解

    随着Linux的应用日益广泛,特别是在网络应用方面,有大量的网络服务器使用Linux操作系统.由于Linux的桌面应用和Windows相比还有一定的差距,所以在企业应用中往往是Linux和Window ...

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

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

  6. linux系统需要占多大的内存,linux启动过程Bootloader、kernel

    256M可以推1080P屏幕 128M可以基本运行并安装 256M可以勉强开启特效 512M流畅运行特效 当然内存越大越好,特效与显卡也有关系 和windows相比,当然linux对内存的需求小 Bo ...

  7. linux启动过程中内核拷贝,轻松识破linux内核启动过程中的“”套路“”

    内核启动流程相关的内容让很多热爱linux的小伙伴既爱又恨,因为这是了解linux系统基本构造的良好过程同时由于其本身复杂且底层,脑子中的脉络不是很清晰,本文就总结了一些优秀博文,以自己的理解来解构一 ...

  8. 深入理解Linux内存管理(0.3)

    学习方法论 写作原则 标题括号中的数字代表完成度与完善度 0.0-1.0 代表完成度,1.1-1.5 代表完善度 0.0 :还没开始写 0.1 :写了一个简介 0.3 :写了一小部分内容 0.5 :写 ...

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

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

最新文章

  1. 学习C++就这么简单 ——《写给大家看的C++书》
  2. 数据中心母线布置方式
  3. 无责任畅想:云原生中间件的下一站
  4. win7 打开“计算机”慢,win7电脑启动慢解决方法
  5. b树删除节点每次只能删一个吗_深入理解数据库系统之存储存引擎(B树)
  6. 在 Exchange 服务器上的操作系统中的防病毒软件
  7. 综合对比各个设计模式的思想
  8. 剑指Offer之求解1+2+....+n
  9. 新手兼职也能月入5000的副业项目,几乎零门槛
  10. 计算机表格的条件公式,电脑Excel输出时如何进行多条件判断
  11. python 根据word生成ppt_未明学院:利用Python将Wordamp;PPT批量转成PDF
  12. 单片机及接口课程设计报告-------基于音乐播放器
  13. re.findall 用法
  14. 网页链接只能在微信端打开
  15. 基于SSM的毕业设计管理系统
  16. 你觉得iPhone 13能成为下一个iPhone 6s吗?
  17. php 中断请求,PHP 信号中断系统
  18. 高德地图-实现地图搜索点选位置功能
  19. 2021年G3锅炉水处理找解析及G3锅炉水处理复审考试
  20. Redis——商品秒杀之库存遗留问题

热门文章

  1. raw图片处理软件:DxO PhotoLab for Mac
  2. 新版微信-微信公众号一键关注解决办法
  3. AdB android 投屏 usb,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
  4. 华纳云:MySQL数据丢失的原因是什么及怎么解决
  5. Spring WebFlux框架概述
  6. (二)向前 向后 中心差商
  7. element-plus popover的z-index问题
  8. MyBatis中的resultMap两个association
  9. C#,图像二值化(13)——全局阈值的双峰平均值算法(Bimodal Thresholding)与源程序
  10. 基于朴素贝叶斯实现文本分类