• Linux学习笔记6 - 系统启动流程


    1.概述

    • PC上电后,CPU将进入实模式,并从地址0xFFFF0000开始执行程序代码,此地址通常为ROM-BIOS中的地址。
      此时BIOS进行开机自检,并按照BIOS中设置的启动设备(通常是硬盘)进行启动,然后启动设备上安装的引导程序lilo或者grub开始引导Linux(启动设备的第一个扇区),其时Linux才真正获得启动权。
    • Linux获得启动权后,首先进行内核的引导,主要完成磁盘引导读取机器系统数据实模式保护模式的切换,
      加载数据段寄存器以及重置中断描述符表等。
    • 然后执行init程序(即系统初始化的工作),init程序调用了rc.sysinitrc等程序,而rc.sysinitrc在完成系统初始化和运行服务的任务后,返回init.
    • init启动mingetty,打开终端用户供用户登录系统,登录成功后就进入shell,此即完成从开机到登陆的整个启动过程。

    启动流程示意图:

    在ROM-BIOS:0xFFFF0000处开始执行代码
    完成磁盘引导,读取机器数据,实模式和保护模式切换等,然后返回init
    进入shell
    PC开机,CPU进入实模式
    BIOS开机自检
    安装的lilo\grub引导Linux获取启动权
    内核引导
    再执行init调用rc.sysinit,rc等程序
    启动mingetty,打开终端登录login
    完成开机

    2.内核引导阶段

    • grublilo等引导程序成功引导Linux系统后,Linux便从其手中接管了CPU的控制权,在启动的过程中主要用到内核源码目录的几个文件:bootsect.Ssetup.S、以及compressed子目录下的head.S等。

    • Linux内核通常是经过压缩的,上面的几个重要的汇编程序,其皆在压缩内核vmlinuz中。

    • Linux提供的内核包含了众多驱动和功能,容量较大,压缩内核可以节省大量空间。

    • 压缩内核在启动时可以对自身进行解包。

    内核启动文件执行流:

    start_kernel内核初始化
    bootsect.S
    setup.S
    head.S
    main.c
    调用init函数

    3.init阶段

    • 在内核加载之后,由内核执行引导的第一个进程是init进程,此进程号始终为1(PID=1)。该进程根据其配置文件"/etc/inittab"主要完成一系列的初始化任务,此配置文件是该进程执行的唯一依据。
    • inittab文件除注释行外,每一行皆有其格式: id:runlevels:action:process
      • id:配置记录符
        • 1~4个字符组成,对于getty或者mingetty等其他login程序项,要求idtty的编号相同,否则getty程序将不能正常工作。
      • runlevels:运行级别记录符
        • 一般使用0~6以及Ss,其中0,1,6运行级别为系统保留,
          • 0:shutdown动作
          • 1:重启至单用户模式,在此模式下,用户登录不需要密码,网卡默认是不加载的,一些服务也是不能用的
          • 2:表示多用户,NFS服务不开启*
          • 3:表示命令行模式*
          • 4:保留未用*
          • 5:图形用户模式*
          • 6:重启系统
          • S/s:单用户模式,且无需inittab文件,因此也不在inittab中出现
          • 7~9:可以使用,传统的UNIX没有定义此级别
        • runlevels可以并列多个值,对多数action来说,仅当runlevel与当前运行级别匹配成功才会执行。
      • action:描述系统执行特定操作
        • 常见设置有:initdefault,sysinit,boot,bootwait,respawn等。
          • initdefault:系统默认的启动级别,即开机之后默认进入的运行级别*
          • sysinit:系统初始化,只有系统开机或重新启动的时候,这个process才会被执行一次
          • boot:只有在引导过程中,才执行该进程,但不等待该进程的结束;当该进程死亡时,也不重新启动该进程*
          • bootwait:只有在引导过程中,才执行该进程,并等待进程的结束;当该进程死亡时,也不重新启动该进程*
          • respawn:表示process进程结束之后会重新启动运行*
      • process:设置启动进程所执行的命令
    • init进程的作用是启动Linux系统服务(也就是运行在后台的守护进程)
    • Linux系统服务包括两种:
      • 第一种独立运行的系统服务,其常驻内存中,开机后一直运行。
      • 第二种是有xinet设定的服务,能够同时监听多个指定端口,根据请求需求启动不同的网络服务进程,可以将其看作是一个启动服务的服务管理器。

    参考文献:《Linux嵌入式应用程序开发标准教程(第2版)》
    参考文献:《Linux下inittab文件详解》

  • 相关阅读:
    Vue3 - Pinia 状态管理,解构 store(Pinia storeToRefs API 详细使用教程)
    LeetCode简单题之找到和最大的长度为 K 的子序列
    SpringBoot+MinIO(三)
    数据结构---单链表
    maven 多模块项目的测试覆盖率分析 - jacoco 聚合分析
    Redis的使用--集群模式
    【1day】复现时空智友企业流程化管控系统任意文件读取漏洞
    C# OpenCvSharp Mat操作-操作符重载
    Apache Hive源码阅读环境搭建
    ​力扣解法汇总1624-两个相同字符之间的最长子字符串
  • 原文地址:https://blog.csdn.net/weixin_43940932/article/details/126613834