• linux内核启动流程


    概述

      Linux内核启动流程根据是否与体系结构相关主要可分为两个阶段。
    第一阶段:引导过程
     ==> 系统上电
        ===> CPU自身初始化

    ---------------------------------BIOS------------------------------------------
          ===> 加电自检
            ===> 加载内核引导程序

    ------------------------------内核引导程序-----------------------------------
              ===> 主引导程序
                ===> 次引导程序

    ----------------------------------------------------------------------------------
                  ===> 调用内核

    1、CPU自身初始化

      CPU 自身的初始化是引导过程的第一步,如果有多个 CPU,即多处理器系统,则每个CPU 都要进行自身初始化。CPU自身初始化之后从一个固定的位置(一般是0xfffffff0)取得指令并执行该指令为跳转指令跳转到BIOS代码的首部。


    2、BIOS

      BIOS 被固化于主板上一个容量相对较小的只读存储器(Read-Only Memory,ROM)中,它的工作主要有两个:加电自检,即进行所谓的 POST(Power On Self Test)和加载内核引导程序

      POST 阶段完成系统硬件的检测,包括内存检测、系统总线检测等。POST 完成之后,BIOS 读取启动设备第一个扇区,即首 512 字节的信息, 该扇区又被称之为主引导记录(Master Boot Record,MBR)。MBR 中保存了内核引导程序的开始部分,BIOS 将其加载到内存并执行。
     
    3、内核引导程序

      内核引导程序分为两个阶段:MBR 中的主引导程序;活动分区引导记录中的次引导程序。MBR 中的主引导程序是一个 512 字节的映像,它包含了 446 字节的程序代码和 64 字节的分区表,最后两个字节固定为 0xAA55,用于检查 MBR 是否有效。
    主引导程序:扫描分区表,寻找活动分区,将位于活动分区引导记录中的次引导程序加载到内存中并执行。
    次引导程序:负责加载 Linux 内核映像,并将控制权转交给内核。

    4、内核

    函数 位置(ARCH为体系架构,如arm、i386....) 功能
    start           arch/ARCH/boot/head.S 进行一些基本的硬件设置
    startup_32 arch/ARCH/boot/compressed/head.S 例程设置一个基本的运行环境(堆栈等),并清除 BSS(Block Started by Symbol)
    decompress_kernel arch/ARCH/boot/compressed/misc.c 解压内核
    startup_32 arch/ARCH/kernel/head.S 对页表进行初始化,启用内存分页功能,并为任何可选的浮点单元(FPU)检测 CPU 的类型
    start_kernel arch/ARCH/kernel/head.S 进入体系结构无关的内核部分。自此,内核的引导过程告一段落,进入内核的初始化过程。

    总结:引导过程可归纳为:CPU 加载 BIOS,BIOS 加载内核引导程序,内核引导程序加载压缩内核,压缩内核加载解压内核。

    第二阶段:内核初始化

    函数 位置 功能
    start_kernel init/main.c 完成了内核的大部分初始化工作,相当于内核的 main 函数
    reset_init init/main.c 启动内核线程 kernel_init
    kernel_init init/main.c  完成设备驱动程序的初始化
    init_post init/main.c 启动用户空间的 init进程

    至此,内核已被引导并进行了初始化,且启动了自己的第一个用户空间应用程序,即 init。这是调用的第一个使用标准 C 库编译的程序,其进程编号始终为 1。

    海阔凭鱼跃,天高任鸟飞。
  • 相关阅读:
    关于sqlserver2008 bcp根据数据表导出xml格式文件的小记
    关于SQL SERVER 2008 X64版本报错:消息 7302,级别 16,无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 的实例。
    Response.Redirect(),Server.Transfer(),Server.Execute()的区别[转]
    ASP.net应用程序中如何调用客户端的Javascript脚本小结(转)
    重写ListView控件,实现点击列头排序的功能
    关于Response.redirect和Response.End出现线程中止异常的处理(转)
    持续集成cruisecontrol.net学习总结
    [转]关于PowerDesigner反向工程SQL Server2000数据库时生成注释的解决方法
    敏捷开发scrum学习笔记一
    asp.net缓存机制总结(转)
  • 原文地址:https://www.cnblogs.com/chenshikun/p/9389578.html
Copyright © 2020-2023  润新知