当前位置: 首页 > news >正文

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文件详解》

相关文章:

  • 动态数组写模板类
  • 代码错误与检查简短教程(新手适用)
  • Java Design Patterns 之API 网关模式
  • vue框架的基础语法之方法和事件的绑定,样式绑定,循环渲染,条件渲染
  • 项目第一天
  • go get 拉取报错The project you were looking for could not be found的解决方法
  • 算法题练习——NC15 求二叉树的层序遍历、NC88 寻找第K大
  • java基于springboot+vue的汉服推广与交流平台
  • 6面向对象中的继承
  • 【非正式协议 Objective-C语言】
  • Java面试题09-ThreadLocal的底层原理
  • Golang依赖管理(GOPATH->vendor->Go Module)
  • java计算机毕业设计网上报名及成绩查询系统源码+数据库+系统+lw文档+mybatis+运行部署
  • 机器学习泛化误差
  • 常见的几种填充方式:ZeroPad2d/ReflectionPad2d...(Pytorch)
  • 【Leetcode】101. 对称二叉树
  • Apache Pulsar 2.1 重磅发布
  • CentOS从零开始部署Nodejs项目
  • ES6语法详解(一)
  • flutter的key在widget list的作用以及必要性
  • gcc介绍及安装
  • Java读取Properties文件的六种方法
  • jdbc就是这么简单
  • KMP算法及优化
  • node入门
  • V4L2视频输入框架概述
  • 爱情 北京女病人
  • 二维平面内的碰撞检测【一】
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 基于组件的设计工作流与界面抽象
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • (1)(1.13) SiK无线电高级配置(五)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (70min)字节暑假实习二面(已挂)
  • (C)一些题4
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十四)Flask之flask-session组件
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (排序详解之 堆排序)
  • (译)计算距离、方位和更多经纬度之间的点
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)关于多人操作数据的处理策略
  • (转)一些感悟
  • .NET CORE Aws S3 使用
  • .NET 设计模式初探
  • .NET企业级应用架构设计系列之技术选型
  • .NET企业级应用架构设计系列之开场白
  • .NET设计模式(11):组合模式(Composite Pattern)
  • @EnableConfigurationProperties注解使用
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件