0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Linux启动流程基本分析

嵌入式开发星球 来源:嵌入式开发爱好者 作者:嵌入式开发爱好者 2024-05-11 08:49 次阅读

Linux启动流程总的来说可以分成三个阶段

wKgaomY_EnCAZEZEAABmJsWW0ew914.png

Linux启动流程图

wKgZomY_EnSAdg9lAAELRtRK-m4322.png

第一步:上电

Ø在 x86 系统中,将 1M 空间最上面的 0xF0000 到 0xFFFFF 这 64K 映射给 ROM

Ø当电脑刚加电的时候,会做一些重置的工作,将 CS 设置为 0xFFFF,将 IP 设置为 0x0000,所以第一条指令就会指向 0xFFFF0,正是在 ROM 的范围内。

Ø在这里,有一个 JMP 命令会跳到 ROM 中做初始化工作的代码,于是,BIOS 开始进行初始化的工作

wKgaomY_EnWAFedLAAHlUjps-iQ799.png

第二步:BIOS启动

固件初始化:计算机开机后,UEFI固件会进行初始化,包括硬件初始化、自检和加载UEFI固件驱动程序等。

启动设备选择:UEFI固件会检测并识别可启动的设备,如硬盘、光盘、USB设备等。它会根据预设的启动顺序或用户设置的启动选项,选择一个可启动的设备作为启动介质。

UEFI固件驱动程序加载:UEFI固件会加载设备上的UEFI固件驱动程序,这些驱动程序负责与硬件设备进行交互,以便后续的启动过程能够正常进行。

UEFI应用程序加载:UEFI固件会加载位于启动介质上的UEFI应用程序,如引导加载程序(Bootloader)或操作系统的引导管理器。这些应用程序通常位于EFI系统分区中,以.efi文件格式存在。

引导加载程序执行:加载的引导加载程序会接管控制权,负责加载操作系统内核或其他引导组件。常见的引导加载程序有UEFI Shell、GRUB、rEFInd等。

wKgZomY_EnWAIVxuAAcZs3TwjpM695.png

第三步:Linux启动

wKgaomY_EnaAD6M3AAEsPja247Y256.png

Linux启动-引导

Ø我们可以通过BIOS界面选择硬盘启动项进入OS,那BIOS是怎么发现这个硬盘里有OS?

Ø答案就是MBR(Master Boot Record),

ØMBR是放在硬盘的第一个扇区,一共512字节,

Ø可以分成两部分:

Ø主引导记录:安装启动引导程序的地方,446字节,

Ø分区表:记录整个硬盘分区的的状态此外,64字节

Linux启动-引导EBR/VBR

Ø找到MBR后下一步做啥?

Ø(1)如果查找分区表时发现操作系统装在主分区,然后执行已载入的MBR中的boot loader代码,加载该激活主分区的VBR中的boot loader,至此,控制权就交给了VBR的boot loader

Ø(2)如果操作系统不是装在主分区,那么肯定是装在逻辑分区中,所以查找完主分区表后会继续查找扩展分区表,直到找到EBR所在的分区,然后MBR中的boot loader将控制权交给该EBR的boot loader

wKgZomY_EnaAEmUjAADPVmZqaSM166.png

Linux启动-引导GRUB2介绍

ØGNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数

Ø生成配置文件:grub2-mkconfig -o /boot/grub2/grub.cfg

Ø安装:grub2-install /dev/sda

Linux启动-引导GRUB2加载

ØGrub2 第一个安装的就是 boot.img,BIOS 完成任务后,会将 boot.img 从硬盘加载到内存中的 0x7c00 来运行。boot.img会加载 core.img。如果从硬盘启动的话,这个扇区里面是 diskboot.img,diskboot.img 的任务就是将 core.img 的其他部分加载进来,先是解压缩程序 lzma_decompress.img,再往下是 kernel.img,最后是各个模块 module 对应的映像。这里需要注意,它不是 Linux 的内核,而是 grub 的内核。

Ø随着我们加载的东西越来越大,实模式这 1M 的地址空间实在放不下了,所以在真正的解压缩之前,lzma_decompress.img 做了一个重要的决定,就是调用 real_to_prot,切换到保护模式,这样就能在更大的寻址空间里面,加载更多的东西。

wKgaomY_EnaAT7aCAAE1sD5yt_s766.png

Linux启动-0/1号进程

Øset_task_stack_end_magic(&init_task)。这里面有一个参数 init_task,它的定义是 struct task_struct init_task = INIT_TASK(init_task)。

Ø它是系统创建的第一个进程,我们称为 0 号进程。这是唯一一个没有通过 fork 或者 kernel_thread 产生的进程,是进程列表的第一个。

Ø1.trap_init()中断初始化

Ø2.mm_init()内存初始化

Ø3.sched_init()调度策略初始化

Ø4.vfs_caches_init()基于内存文件系统rootfs初始化

Ø5.start_kernel()->rest_init()其他方面的初始化

Ørest_init 的第一大工作是,用 kernel_thread(kernel_init, NULL, CLONE_FS) 创建第二个进程,这个是 1 号进程。1 号进程对于操作系统来讲,有“划时代”的意义。

Linux启动-ramdisk

Øinit 程序是在文件系统上的,文件系统一定是在一个存储设备上的,例如硬盘。Linux 访问存储设备,要有驱动才能访问。如果存储系统数目很有限,那驱动可以直接放到内核里面,但是文件系统的格式有很多,全都放进内核那内核就太大了。

Ø这该怎么办呢?

Ø我们只好先弄一个基于内存的文件系统。内存访问是不需要驱动的,这个就是 ramdisk。这个时候,ramdisk 是根文件系统。

Ø运行 ramdisk 上的 /init,等它运行完了就已经在用户态了。/init 这个程序会先根据存储系统的类型加载驱动,有了驱动就可以设置真正的根文件系统了。有了真正的根文件系统,ramdisk 上的 /init 会启动文件系统上的 init。

Linux启动-init介绍

Ø前面0/1进程都属于内核线程,ps pid=1的是init进程

Ø if (ramdisk_execute_command) {

Øret = run_init_process(ramdisk_execute_command);

Ø...... }

Ø......

Øif (!try_to_run_init_process("/sbin/init") ||

Ø!try_to_run_init_process("/etc/init") ||

Ø !try_to_run_init_process("/bin/init") ||

Ø!try_to_run_init_process("/bin/sh")) return 0

Ø它会尝试运行 ramdisk 的“/init”,或者普通文件系统上的“/sbin/init”“/etc/init”“/bin/init”“/bin/sh”。不同版本的 Linux 会选择不同的文件启动,但是只要有一个起来了就可以。

ØInit类型:

ØSysV:CentOS 5之前, 配置文件/etc/inittab

ØUpstart:CentOS 6,配置文件/etc/inittab,/etc/init/*.conf

ØSystemd:CnetOS7, 配置文件/usr/lib/system/syste,/etc/systemd/system

Linux启动-运行级别

wKgZomY_EneATbXBAAIwVelTcj0039.png

Linux启动-fstab

Ø任何硬件设备连接后,操作系统使用硬件,即需要挂载。windows只不过是自动“挂载”了,linux需要手动自己搞。在Linux系统下,例如每次挂载/dev/sdb1(例如U盘设备文件)需要手动使用命令mount。当然,每次重启,开启时,硬盘一般也是被自动挂载的,而自动挂载的信息,就记录在/etc/fstab文件中。

Ø 系统每次启动都会读取/etc/fstab中的配置内容,自动挂载该文件中被记录的设备和分区。

Ø 第一列:设备文件或UUID或label(三者的区别看下面)

Ø 第二列:设备的挂载点(空目录)

Ø 第三列:该分区文件系统的格式(可以使用特殊的参数auto,自动识别分区的分区格式)

Ø 第四列:文件系统的参数,设置格式的选项

Ø 第五列:dump备份的设置(0表示不进行dump备份,1代表每天进行dump备份,2代表不定日期的进行dump备份)

Ø 第六列:磁盘检查设置(其实是一个检查顺序,0代表不检查,1代表第一个检查,2后续.一般根目录是1,数字相同则同时检查)

Linux启动-用户登录

一般来说:用户登录方式有三种

1.命令行登录

2.ssh登录

3.图形登录

Linux是多任务多用户的操作系统,它允许多人同时在线工作。但每个人都必须要输入用户名和密码才能验证身份并最终登录。但登陆时是以图形界面的方式给用户使用,还是以纯命令行模式给用户使用呢?这是终端决定的,也就是说在登录前需要先加载终端。

现代Linux上,console终端已经和原始的意义不太一样了,其设备映射在/dev/console上,所有内核输出的信息都输出到console终端,而其他用户程序输出的信息则输出到虚拟终端或伪终端。

总结下:

/dev/console:控制台终端

/dev/ttyN:虚拟终端,ctrl+alt+f[1-6]切换的就是虚拟终端

/dev/ttySN:串行终端

/dev/pts/N:伪终端,ssh等工具连接过去的活着图形终端下开启的命令行终端就是伪终端。

Linux启动-用户切换

Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们

Ø

Ø针对我的VM Virtual BOX ctrl+alt + F1是图形终端, ctrl+alt + F2~F6命令行终端

Linux启动流程思维导图

wKgaomY_EneAcT_aAAM_4NRrTcg788.png

end


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209462
  • grub2
    +关注

    关注

    0

    文章

    2

    浏览量

    4803
收藏 人收藏

    评论

    相关推荐

    linux启动流程分析

    linux启动流程分析
    发表于 08-04 00:27

    嵌入式Linux启动流程简介

    目录嵌入式 Linux 启动流程简介启动流程Bootloader 简介市面上可见的 bootloader入式
    发表于 11-04 09:04

    Linux启动流程是怎样的

    本文简单的介绍了什么是嵌入式系统,以及嵌入式Linux的系统结构,并且简单的介绍了Linux启动流程
    发表于 11-05 06:44

    详细分析嵌入式Linux系统启动流程

    在嵌入式Linux专题(一)中已经对嵌入式Linux系统的架构及启动流程有了初步的介绍,本文将详细分析嵌入式
    发表于 11-05 09:25

    Linux文件系统启动流程

    Linux 命令的结合使用Linux 文件系统启动流程sysvinit服务的管理与裁剪systemd服务的管理与裁剪了解 qt4、qt5 的移植了解 yocto构建文件系统常规
    发表于 12-17 06:00

    典型ARM嵌入式Linux设备启动流程是怎样的?

    典型ARM嵌入式Linux设备启动流程是怎样的?
    发表于 12-23 06:25

    linux内核启动内核解压过程分析

    linux启动时内核解压过程分析,一份不错的文档,深入了解内核必备
    发表于 03-09 13:39 1次下载

    linux内核启动流程

    Linux启动代码真的挺大,从汇编到C,从Makefile到LDS文件,需要理解的东西很多。毕竟Linux内核是由很多人,花费了巨大的时间和精力写出来的。而且直到现在,这个世界上仍然有成千上万的程序员在不断完善
    发表于 11-14 16:19 4352次阅读
    <b class='flag-5'>linux</b>内核<b class='flag-5'>启动</b><b class='flag-5'>流程</b>

    详解bootloader的执行流程与ARM Linux启动过程分析

    S3C2410 ARM处理器为例,详细分析了系统上电后 bootloader的执行流程及 ARM Linux启动过程。
    的头像 发表于 12-21 09:24 1.1w次阅读
    详解bootloader的执行<b class='flag-5'>流程</b>与ARM <b class='flag-5'>Linux</b><b class='flag-5'>启动</b>过程<b class='flag-5'>分析</b>

    嵌入式 Linux 启动流程和 bootloader 介绍

    目录嵌入式 Linux 启动流程简介启动流程Bootloader 简介市面上可见的 bootloader入式
    发表于 11-01 16:32 11次下载
    嵌入式 <b class='flag-5'>Linux</b> <b class='flag-5'>启动</b><b class='flag-5'>流程</b>和 bootloader 介绍

    嵌入式Linux专题(一)——嵌入式Linux系统构成及启动流程

    本文简单的介绍了什么是嵌入式系统,以及嵌入式Linux的系统结构,并且简单的介绍了Linux启动流程
    发表于 11-02 12:36 15次下载
    嵌入式<b class='flag-5'>Linux</b>专题(一)——嵌入式<b class='flag-5'>Linux</b>系统构成及<b class='flag-5'>启动</b><b class='flag-5'>流程</b>

    PyTorch文本分类任务的基本流程

    本分类是NLP领域的较为容易的入门问题,本文记录文本分类任务的基本流程,大部分操作使用了**torch**和**torchtext**两个库。 ## 1. 文本数据预处理
    的头像 发表于 02-22 14:23 1107次阅读

    STM32的完整启动流程分析

    STM32的完整启动流程分析
    的头像 发表于 10-25 16:00 1390次阅读
    STM32的完整<b class='flag-5'>启动</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>

    Linux启动流程中console_init分析

    console_init 分析 Linux 启动函数 start_kernel 会调用 console_init 函数。 linux4.14/kernel/printk/printk.
    的头像 发表于 09-28 16:23 945次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>启动</b><b class='flag-5'>流程</b>中console_init<b class='flag-5'>分析</b>

    Linux整体汇编启动流程分析

    汇编启动流程 先从整体分析汇编做的事情,有个大体框架。 路径: arch/riscv/kernel/head.S ,入口是 ENTRY(_start_kernel) 从 ENTRY
    的头像 发表于 10-08 11:28 564次阅读
    <b class='flag-5'>Linux</b>整体汇编<b class='flag-5'>启动</b><b class='flag-5'>流程</b><b class='flag-5'>分析</b>