本文描述linux系统开机过程,属于个人理解范畴,如果文中表述有误请大家批评指正!

计算机开机之后,首先要加载BIOS(基本输入输出系统)信息,BIOS包含了很多重要的信息,包括CPU信息,设备启动顺序信息,硬盘信息,内存信息,时钟信息等。

由BIOS进行POST(加电自检),然后依据BIOS内设置的引导顺序从硬盘、软盘或者CDROM中读入引导块。linux系统是从BIOS中的OxFFFFO处开始引导的。BIOS的第一个工作时POST,POST的工作就是对硬件进行检测。第二个工作是进行本地设备的枚举和初始化。

BIOS是由两部分组成:POST代码和运行时的服务。当POST完成之后就会被从内存中清理出来,但是BIOS运行时服务依然会保留在内存中。BIOS会按照设置中定义的顺序来搜索处于活动状态并且可以引导的设备。
引导设备可以是硬盘上的某个分区、CD-ROM、软盘、网络上的某个设备或者是USB设备。linux通常是从硬盘上进行引导的,其中主引分区MBR包含了主引导加载程序。当MBR加载到RAM中后,BIOS将控制权转交给MBR,MBR 又叫主引导扇区,是计算机开机后访问硬盘时必须要读取的首个扇区,位于0柱面,0磁道,1扇区。MBR的主引导程序是一个512字节的映像。前446字节是主引导加载程序,接下来的64个字节包含了分区表的信息,还有两个特殊的字节OxAA55用来检查MBR的有效性。
如果系统要想启动就必须启动内核,显然MBR是放不下内核的,但是MBR中有个小程序可以载入其他位置的内核,这个小程序就是boot loader 即GRUB。GRUB允许用户可以选择要启动的操作系统。GRUB包裹三个重要的文件,Stage1、Stage2、Stage1.5. Stage1通常放在MBR中,作用就是在系统启动时用于加载Stage2,并将控制权转交给它。Stage2就是GRUB的核心,所有的功能都由它完成。Stage1.5介于Stage1和Stage2之间,是他们之间的桥梁,因为Stage2较大,通常放在文件系统中,但是Stage1不能识别文件系统,Stage1.5来引导位于某个文件系统中的Stage2。Stage2是GRUB的核心但不是linux的核心,grub加载以后就是为了加载linux的内核,grub的配置

是通过/boot/grub/grub.conf来实现的。

接下来就要加载内核映像到内存中,内核映像是被zlib进行压缩过的,通常是一个zimage或者是bzimage,在映像前有一个例程可以实现少量的硬件设置,并对内核映像解压并将其放到内存中,之后该例程会调用内核,开始启动内核引导过程。内核启动后会向bios查询电脑的所有硬件信息,然后自己开始管理这些设备,以便提供给linux使用内核会尝试驱动这些设备,,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分放在文件系统中,由于此时还没有挂在任何文件系统,因此还不能使用,所以内核会尝试挂在根文件系统,根文件系统至少包含/etc、/bin、/boot、/lib、/dev5大目录,缺一不可,根文件系统挂在是以只读方式挂载,因为这是linux还在启动阶段,不稳定,避免破坏系统资料。

在内核完成引导后,就在本进程空间内加载init程序,进程号是1,init进程是所有进程的发起者和控制者,它是第一个运行的进程,init进程会根据/etc/inittab判断要进入的运行级别,然后直接执行/etc/rc.d/rc.sysinit进行系统初始化,并将启动的相关信息加载到/var/log/dmesg文件中。系统所有的服务启动之后在执行/etc/rc.d/rc.local脚本,将需要开机运行的程序启动。

linux系统开机过程描述的更多相关文章

  1. Linux系统开机启动时的工作原理

    Linux系统开机启动时的工作原理也是深入了解Linux系统核心工作原理的一个很好的途径. 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至 ...

  2. 红帽linux系统开机自启动脚本。

    其实很多东西在最后完成以后会觉得也就那样,有意思的是探究的过程. 前段时间老板要求把一个程序做成linux系统开机自启动脚本的模式. 首先你需要写一个脚本. 我这边建立了一个.sh的脚本,就是用脚本启 ...

  3. linux系统引导过程

    linux系统引导过程 linux-0.11引导时,将依次运行BIOS程序.bootsect.s.setup.s和head.s,完成引导过程后进入到main函数运行.BIOS完成硬件的检查与初始化等工 ...

  4. 原创:四种Linux系统开机启动项优命令超给力超详细详解

    老葵花哥哥又开课了 接下来是你们的齐天大圣孙悟空给你们带来的详细版Linux系统开机启动优化四种命令 第一种方法是很正常的 第二种有点难理解 第三种来自我的一个奇思妙想 本文档秉承 不要钱也不要臀部的 ...

  5. linux系统开机自动挂载光驱 和 fstab文件详解

    Linux 通过 UUID 在 fstab 中自动挂载分区 summerm6关注 2019.10.17 16:29:00字数 1,542阅读 607 https://xiexianbin.cn/lin ...

  6. Linux系统开机启动流程

    (来源学习Linux时,自己做的笔记) Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限, ...

  7. Linux系统初始化过程及运行级别简介

    Linux开机过程: 1 开机自检(BIOS):初始化硬件,查找启动介质 2 MBR引导 3 GRUB引导菜单:GRUB程序安装在Bootloader 4 加载内核(kernel) 5 运行INIT进 ...

  8. Linux学习-开机过程的问题解决

    忘记 root 密码的解决之道 新版的 systemd 的管理机制中,默认的 rescue 模式是无法直接取得 root 权限的喔!还是得要 使用 root 的密码才能够登入 rescure 环境.没 ...

  9. 【Linux系统引导过程】

    *** 第一步 开机自检 根据主板BIOS中的启动顺序,移交系统控制权. 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它. 这是因为BIO ...

随机推荐

  1. object C—类中函数的调用

    Object C-类中函数的调用 创建,三个类.然后,在代码中调用相同名字的函数.观察他们的调用次序. @interface test : NSObject - (void)print; @end @ ...

  2. Visual Studio 调试技巧 (二)-- 为中断设置条件

    今天尽是干货.我们来讨论如何为中断设置条件吧. 就像习大大讲的精确扶贫一样,如果我们能很精确地,仅在需要的时候把断点命中,以查看这个时候的程序数据,我们就能显著地提高 Debug 的效率.为断点设置条 ...

  3. DOM - nodeType 的取值

    DOM 中,共有 12 中不同类型的节点,nodeType 的取值以数值表示. 节点类型 描述 子节点 1  Element  表示元素.  Element, Text, Comment, Proce ...

  4. Unity3D 常用事件

    这里总结一下U3D常用的一些事件 //按下事件,GetKeyDown //抬起事件,Input.GetKeyUp //长按事件,Input.GetKey //任意键按下事件,Input.anyKeyD ...

  5. 如何在获取Datarow对象在其所属DataTable中的Index

    做项目的时候需要先select一个DataTable的子集,后来又需要子集中这些DataRow的Index, 这个需求本来就有些奇怪,网上也没搜到.刚开始走了很多弯路,后来发现一个简便方法 'dr是你 ...

  6. java中的类集框架

    1.什么是类集框架 1.是一组类和接口 2.位于java.util包当中 3.主要用于用户存储和管理对象 4.主要分为三大类——集合.列表和映射 2.类集框架图 虚线框的表示接口,实线框的表示实现类 ...

  7. TFS 服务器更换后工作区无法绑定

    需要删除工作区,删除命令如下 tf workspace /delete 工作区名;创建的用户 /server:TFS服务器 例 tf workspace /delete WHQ-PC;whq /ser ...

  8. VS2010在WIN7 64位系统下架设网站及路由器配置

    步骤一:安装IIS 打开[控制面板]-[程序和功能],在左侧进入[打开或关闭windows功能],按照下图选择Internet信息项目下的子选项并安装: 步骤二:配置应用程序池 打开[控制面板]-[管 ...

  9. Notepad++在编程使用时的小技巧

    http://blog.csdn.net/freewaywalker/article/details/8010790 为了编程时更快捷和适应个人习惯,我们可以对Notepad++进行一系列的设置,这当 ...

  10. IOS-textField

    //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, ...