• X86架构下Linux启动过程分析


    1X86架构下的从开机到Start_kernel启动的整体过程

    这个过程简要概述为:

    开机——>BIOS——>GRUB/LILO——>Linux Kernel

    其执行的流程图和重要函数例如以下图所看到的:

     

     

    2、载入Linux内核(基于X86)的内存布局图

    |          |

    0A0000 +--------------------------+

    |  Reserved for BIOS    | Do not use. Reserved for BIOS EBDA.

    09A000 +--------------------------+

    |  Command line    |

    |  Stack/heap    | For use by the kernel real-mode code.

    098000 +--------------------------+

    |  Kernel setup    | The kernel real-mode code.

    090200 +--------------------------+ <---  __start函数開始运行地址

    |  Kernel boot sector    | The kernel legacy boot sector.

    090000 +--------------------------+ <---  header.S

    |  Protected-mode kernel | The bulk of the kernel image.

    010000 +--------------------------+

    |  Boot loader    | <- Boot sector entry point 0000:7C00

    001000 +--------------------------+

    |  Reserved for MBR/BIOS |

    000800 +---------------------------+

    |  Typically used by MBR |

    000600 +--------------------------+ 

    |  BIOS use only        |

    000000 +--------------------------+

    3、启动

    2BIOS启动引导阶段

    BIOS调用Bootloader来把操作系统的内核映像载入到系统RAM中。

    (1)、当PC的电源打开后,80x86架构的cpu将自己主动进入实模式,并从地址0xFFFF0(CS0xFFFFIP0x0)開始自己主动运行程序代码,这个地址一般是BIOS的地址。
    (2)、BIOS的首先进行POSTPower On Self Test即加电后自检),检測系统中一些关键设备是否存在和是否能正常工作,比如内存和显卡等设备。

    此时显卡还没有初始化,假设发现了一些致命错误,比如没有找到内存或者内存有问题(此时仅仅会检查640K常规内存),BIOS会直接控制喇叭发声来报告错误,声音的长短和次数代表了错误的类型。
    (3)、然后物理地址0处開始初始化中断向量(注意:这个BIOS的中断向量非常重要。后边的非常多和硬盘等的交互都是通过此中断向量完毕的)。
    (4)、此后。BIOS将启动设备的第一个扇区(0磁道第一个扇区被称为MBR即主引导记录,它的大小是512字节。里面存放了用汇编语言编写的预启动信息、分区表信息、魔数0x55AA),读入内存绝对地址0x7C00处。并跳转到这个地址并运行。

    事实上被拷贝到物理内存0x7C00处的内容就是Boot Loader,对于较早的内核不靠grub启动的。它就是bootsect.S程序。而对于如今PC多数使用grub引导启动的,就是lilo或者grub了。

    3Bootloader阶段

    Bootloader程序是为计算机载入(load)计算机OS内核的。bootloader程序通常位于硬盘上,被BIOS调用。用于载入内核。在PC机上常见的bootloader主要有grub和lilo等。
        GRUBGRand Unified Bootloader)是当前linux诸多发行版本号默认的引导程序。嵌入式系统上,最常见的bootloaderU-BOOT。这种bootloader一般位于MBR的最前部。

    linux系统中。bootloader也能够写入文件系统所在分区中。

    比方,grub程序就很强大。

     Gurb执行后。将初始化设置内核执行所需的环境。

    然后载入内核镜像。

    grub磁盘引导全过程:

    1stage1、grub读取磁盘的第一个512字节的主引导记录MBR

    (2stage1.5、识别各种不同的文件系统格式,目的是为了grub能识别到文件系统。

    3stage2、载入系统引导菜单(/boot/grub/menu.lstgrub.lst)。载入内核vmlinuzRAM磁盘initrd

    4Linux内核启动过程

    内核映像文件vmlinuz:包括有linux内核的静态链接的可运行文件,传统上,vmlinux被称为可引导的内核镜像。

    vmlinuzvmlinux的压缩文件。

    其构成包括:

    1第一个512字节的bootsect(第一个块)

    2第二个是setup代码,若干不多个512字节(一会再说它多大) 

    3保护模式下的内核代码
        bzImage文件:使用make bzImage命令编译内核源码。能够得到採用zlib算法压缩的zImage文件,即big zImage文件。

    老的zImage解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M0x100000)以上),在保护模式下运行。

     

    bzImage文件由setup和vmlinux两部分组成,setup是实模式下的代码,vmlinux是保护模式下的代码。详细包括vmlinuzbootsect.osetup.o、解压缩程序misc.o、以及其它一些相关文件(如 piggy.o)。

    initramfs(initrd)文件:initrdinitialized ram disk的意思。主要用于载入硬件驱动模块。辅助内核的启动,挂载真正的根文件系统。

  • 相关阅读:
    分布式系统实践解读丨详解高内聚低耦合
    Git:改变世界的一次代码提交
    一分钟带你认识深度学习中的知识蒸馏
    99%的人都能看懂的分布式系统「补偿」机制
    一大波人气博主袭来,现场直播华为全联接2020!
    快速了解前端开发HTML的正确姿势
    华为云IoT智简联接,开启物联世界新纪元
    从一个小程序说起2 C++快速入门03
    从一个小程序说起 C++快速入门02
    PE格式详细讲解6(上) 系统篇06|解密系列
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7049849.html
Copyright © 2020-2023  润新知