Linux启动过程详解

作者:江远航

一、启动流程图如下

图1 Linux启动流程图

BIOS ---> MBR

---> Kernel---> Init

二、Linux启动顺序

一>  BIOS初始化

1、电脑周边设备检查

侦测周围设备是否正常工作,如CPU类型、速度、缓存等、主板类型、内存速

度、内存容量、硬盘大小、硬盘类型、硬盘工作模式、风扇速度等。

2、选择设备开机

软盘启动、光盘启动、网络启动、硬盘启动。

3、选择好哪个设备开机之后,读取这个设备的MBR引导扇区。

4、MBR(Master Boot Record,即的主引导记录)。

主要作用引导磁盘操作系统启动。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区中(0道0柱面1扇区),它由三个部分组成,主引导程序、、硬盘有效标志(55AA)。

第一部分是里主引导程序(boot loader)占446个字节。

第二部分是分区表占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic

number,占2个字节,固定为55AA。

BIOS不是查找操作系统,而是主引导记录。BIOS搜索MBR是否有完整的主

引导记录,如果有,则认为硬盘有操作系统,然后BIOS将MBR整段装载到内存

RAM,将控制权交给MBR。

二>

BootLoader

1、Boot Loader安装

1)安装在硬盘MBR。

2)MBR被其他开机管理程序占用,就可以将Bootloader安装在硬盘其中一个分区的引导扇区上。

2、Boot Loader启动过程。

图2Bootloader启动流程图

Stage1(在Flash中运行):

1)初始化硬件,为stage2及kernel执行准备硬件环境。

包括屏蔽所有中断、设置CPU速度及时钟频率、RAM初始化、初始化LED、关闭CPU指令/Cache数据。

2)为stage2准备RAM空间。

为了获得更快的执行速度,通常把stage2加载到RAM空间执行,因此必须为加

载stage2准备好一段可用的RAM空间范围。

由于stage2通常是C语言执行代码,因此在考虑空间大小时,除stage2映像的大小外,还须把堆栈空间考虑进来。(空间大小最好是memory

page(通常是4KB)倍数,一般1M的RAM空间足够)

3)拷贝uboot到RAM空间。

拷贝时要确定stage2的可执行映像在固态存储设备(ROM、EEPROM或FLASH等)的存放起始地址和终止地址以及RAM空间的起始地址。

4)设置堆栈。

设置堆栈指针是为执行C语言代码做好准备,此外,在设置堆栈指针SP之前,也可以关闭LED灯,以提示用户准备跳转到stage2。

上述就绪后,可以跳转到stage2去执行。(比如在RAM系统中,可以通过修

改PC寄存器为合适的地址来实现)

Stage2(拷贝至RAM中运行):

1)初始化本阶段需要用到的硬件设备。

通常包括:至少初始化一个串口以便和终端用户进行I/O输出信息,初始化计时器等。在初始化这些设备之前,可以重新把LED灯点亮,表明已经进入main函数执行。设备初始化完成,可以输出一些打印信息,程序名字字符串、版本号等。

2)检测系统内存映射。

内存映射指在整个4GB物理地址空间中,哪些地址范围被分配用来寻址系统的RAM单元。检测系统内存映射的目的是要知道CPU预留的全部RAM地址空间中的哪些被真正映射到RAM地址单元。

规划内存占用布局包括两方面:内核映射所占用的内存范围;根文件系统所占用的内存范围。在规划内存占用的布局时,主要考虑基地址和映射的大小。

3)设置内核启动参数

将内核映像和根文件系统映像拷贝到RAM空间后,就可以准备启动Linux内核,但在调用内核之前,须设置Linux内核启动参数。

BootLoader可以通过两种方式传递参数给内核,一种是旧的参数结构方式(parameter_struct)(2.6之前内核版本),另外一种是现在2.6版本在用的参数链表方式(tagged_list),这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK的起始地址和大小,压缩的RAMDISK根文件系统的起始地址和大小,内核命令参数等。

4)调用内核

Bootloader调用Linux内核的方法是直接跳转到内核的第一条指令处,也即是直接跳转到MEM_START+0x8000地址处。

5)消亡

图3Flash与RAM映射及初始化图

系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如,基于ARM7TDMI core的CPU在复位时通常都从地址0x00000000取它的第一条指令。而基于CPU构建的嵌入式系统通常将固态存储设备(ROM、EEPROM或FLASH等)被映射到这个预先安排的地址上,当Bootloader放到Flash的起始处后,系统加电后,CPU将首先执行BootLoader程序。

三>启动GRUB

GNU GRUB和GRUB是GRand

Unified Bootloader的缩写,它是一个多重启动管理器。用来引导不同系统,如windows/linux。

MBR后面64字节是分区表,从分区表中可以知道有没有活动分区,以及哪些是活动分区,通常活动分区就是操作系统所在的分区。GRUB可以建立在MBR中,也可以建立在分区中。

从MBR载入Bootloader开始、载入kernel、载入init这些程序,都是由GRUB这个开机管理程序负责(/boot/grub/grub.conf)

引导过程

1、由硬盘启动时,BIOS通常是转向第一块硬盘的第一个,即(MBR)。

2、装载GRUB和的过程,包括:

1)装载记录

基本引导装载程序所做的唯一的事情就是装载第二引导装载程序。

2)装载Grub

第二引导装载程序实际上是引出更高级的功能,以允许用户装载一个特定的。

3)装载系统

如。GRUB把机器的控制权移交给。

不同的是,都是使用一种称为链式装载的引导方法来启动的,,仅仅是简单地指向操作系统所在分区的第一个。

四>加载内核

当内核映像被加载到内存之后,内核阶段就开始,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像,通常是zImage(压缩映像小于512KB)或bzImage(较大的压缩映像,大于512KB)。在这个内核映像前面是一个例程,现实少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,然后该例程会调用内核,并开始启动内核引导的过程。

1)检测电脑硬件设备。

2)将检测到的硬件驱动程序载入Kernel。(守护进程kerneld)

3)如果必要的驱动程序载入Kernel后将根目录以只读的方式挂载进来。

4)Kernel载入第一个程序init进程。

在/sbin/init上来查寻init,如果没有找到init,就会试着运行/bin/sh,如果还是失败了,那么系统的启动就宣告失败了。

五> Init

在UNIX里,除了进程0(即PID=0的交换进程,Swapper

Process)以外的所有进程都是由其他进程使用fork创建的,这里调用fork创建新进程的进程即为父进程,而相对应的为其创建出的进程则为子进程,因而除了进程0以外的进程都只有一个父进程,但一个进程可以有多个子进程。

以进程标识符(Process

Identifier,即PID)来识别进程。进程0是系统引导时创建的一个特殊进程,在其调用fork创建出一个子进程(即PID=1的进程1,又称init)后,进程0就转为交换进程(有时也被称为空闲进程),而进程1(init进程)就是系统里其他所有进程的祖先。(fork后相当于复制了一份,也就相当于一个副本,所以在以后的程序执行,父进程改变父进程的数据,子进程改变子进程的数据)

init进程是系统所有进程的起点,在完成内核引导后,在本进程空间加载init程序,它的进程号是1。s

1、init进程作用

1)扮演终结父进程角色。

init进程永远不会终止,所以系统确信它的存在,并在必要时以它为参照。如果某个进程在它衍生出来的全部子进程结束前被终止,就会出现以init为参照的情况,这个子进程立刻成为init的子进程,init进程自动对终止的子进程调用wait,防止产生僵尸进程。

2)进入某个特定的运行级别(Runlevlel)时运行相应的程序,以此对各种运行级别进行

管理。(由/etc/inittab文件定义)

Init程序读取/etc/inittab文件决定做哪些操作

1)决定预设要使用哪个Run Level

2)Init会初始化作业系统的程序/etc/rc.d/rc.sysinit

3)Init根据执行的Run level来对应目录里的程序,决定开启哪些服务

操作系统

操作系统(英语:Operating System,简称OS)是管理与资源的,同时也是的核心与基石。操作系统身负诸如管理与配置、决定系统资源供需的优先次序、控制输入与、操作与管理等基本事务。操作系统也提供一个让用户与系统交互的操作接口。

操作系统的形态非常多样,不同机器安装的操作系统可从简单到复杂,可从的到的大型操作系统。许多操作系统制造者对它涵盖范畴的定义也不尽一致,例如有些操作系统集成了,而有些仅使用文字接口,而将图形接口视为一种非必要的应用。

操作系统理论在科学中,为历史悠久而又活跃的分支;而操作系统的设计与实现则是工业的基础与核心。

2内核

内核,是一个操作系统的核心。它负责管理系统的进程、、设备、文件和系统,决定着系统的性能和稳定性。

“内核”指的是一个提供抽象层、磁盘及控制、多任务等功能的。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。

内核是操作系统最基本的部分。它是为众多应用提供对的安全访问的一部分,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。抽象隐藏了复杂性,为和硬件提供了一套简洁,统一的接口,使更为简单。s

严格地说,内核并不是计算机系统中必要的组成部分。可以直接地被调入中执行,这样的设计说明了设计者不希望提供任何抽象和操作系统的支持,它常见于早期计算机系统的设计中。最终,一些辅助性,例如程序加载器和调试器,被设计到机器核心当中,或者固化在里。这些变化发生时,操作系统内核的概念就渐渐明晰起来了。

摘自:

《基于嵌入式ARM的Bootloader研究与实现》

《Bootloader研究》s

centos7 启动流程图_Linux启动过程详解相关推荐

  1. mysql5.7如何启动服务_Mysql 5.7.18安装方法及启动MySQL服务的过程详解

    MySQL 是一个非常强大的关系型数据库.但有些初学者在安装配置的时候,遇到种种的困难,在此就不说安装过程了,说一下配置过程.在官网下载的MySQL时候,有msi格式和zip格式.Msi直接运行安装即 ...

  2. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  3. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  4. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

  5. Spring启动过程详解

    Spring启动过程详解 前言 spring容器启动过程 AnnotationConfigApplicationContext 有参数构造方法 无参数构造 AnnotatedBeanDefinitio ...

  6. linux efi 启动原理,Linux(RHEL6)启动过程详解

    Linux(RHEL6)启动过程详解 Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包 ...

  7. android启动页使用gif,android中使用react-native设置应用启动页过程详解

    一.背景 在我们使用react-native进行编写代码的时候,当启动应用的时候,我们会看到如下界面 然而,这样的启动界面是非常的不又好,那么我们该怎么进行处理启动界面呢?有如下两种方案 二.方案 1 ...

  8. 嵌入式linux的u-boot系统启动过程,【站友投递】U-boot启动过程详解

    [站友投递]U-boot启动过程详解 来源:互联网 作者:denny 时间:2009-03-18 Tag:点击: 一.U-BOOT的目录结构 u-boot目录下有18个子目录,分别存放管理不通的源程序 ...

  9. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

最新文章

  1. ActionDescriptor 的认识
  2. ATMEGA8 DIP-28面包板实验
  3. Ubuntu8.10安装Netbeans6.7中文乱码解决方案
  4. 转贴——灰鸽子的危害超出‘熊猫烧香’10倍
  5. Mask-SLAM:基于语义分割掩模的鲁棒特征单目SLAM
  6. C++_逻辑运算符_非_与_或---C++语言工作笔记015
  7. python动态视频下载器
  8. 不造AI杀人武器当然好,但牛津学者觉得马斯克们忽略了重点
  9. 资深和新手的100大 Selenium面试问答
  10. 免装版_ProeWildfire 5.0 免装版 安装教程详解
  11. SwitchHost下载安装和配置
  12. python爬虫爬当当网_python爬取当当网图书排行榜
  13. MFC中stdafx.h文件
  14. onion浏览器下载_洋葱浏览器最新下载_洋葱浏览器官方版 - 软件帝
  15. 景深决定照相机什么特性_什么是景深?
  16. (不定期更新)《虚拟现实应用技术》(Yanlz+Unity+XR+VR+AR+MR+AVE+Oculus+SteamVR+眩晕症+5G+云计算+边缘计算+人机交互+立钻哥哥+==)
  17. MDK配置jlink仿真器步骤
  18. 玲珑杯Unity开发心得——进度条界面(异步加载游戏场景)
  19. Android视频背景,动态背景,Android用视频做背景的轻松实现
  20. 浅析Trafodion体系结构

热门文章

  1. Nginx配置——防盗链
  2. Microsoft Dynamics CRM 2015 数据管理 之 如何批量导入数据到 正式区(二)系统自带示例数据 安装及教学...
  3. 通过rsync实现数据备份
  4. mysql的如何输入dateadd_mysql中date_add()函数的使用?
  5. 深入学习Tomcat----自己动手写服务器(附服务器源码)
  6. js获取和设置属性的方法
  7. 富数据控件 GridView(定义列、格式化、样式)
  8. 套接字选项SO_KEEPALIVE
  9. C++是类型安全的吗?
  10. 无参数的构造函数如何声明对象?