Linux系统启动过程

  • Post author:
  • Post category:linux

关于linux 系统的启动流程我们可以按步进⾏划分为如下:

BIOS

  • POST ⾃检
  • BIOS(Boot Sequence)

引导操作系统

  • 加载对应引导上的MBR(bootloader)
  • 主引导设置加载其BootLoader

加载操作系统

从启动电源到BIOS

当我们按下电源键,主板会发向电源组发出信号,接收到信号后,电源会提供合适的电压给计算机。当主板收到电源正常启动的信号后,主板会启动CPU。CPU重置所有寄存器数据,并设置初始化数据,这个初始化数据在X86架构里如下所示:

    IP          0xfff0
    CS selector 0xf000
    CS base     0xffff0000
    IP/EIP (Instruction Pointer) : 指令指针寄存器,记录将要执行的指令在代码段内的偏移地址
    CS(Code Segment Register):代码段寄存器,指向CPU当前执行代码在内存中的区域(定义了存放代码的存储器的起始地址)

Bash
实模式采取内存段来管理 0 – 0xFFFFF的这1M内存空间,但是由于只有16位寄存器,所以最大地址只能表示为0xFFFFF64KB),因此不得不采取将内存按段划分为64KB的方式来充分利用1M空间。也就是上所示的,采取段选择子 + 偏移量的表示法。这种方法在保护模式中对于页的设计上也沿用了下来。具体的计算公式如下所示:

PhysicalAddress = Segment Selector * 16 + Offset

Bash
  该部分由硬件完成,通过计算访问0XFFFF0,如果该位置没有可执行代码则计算机无法启动。如果有,则执行该部分代码,这里也就是我们故事的开始,BIOS程序了。

关于BIOS

1. BIOS 是什么

上个世纪70 年代初,”只读内存”(read-only memory ,缩写为ROM )发明,开机程序被刷⼊ROM 芯⽚,计算机通电后,第⼀件事就是读取它。计算机,启动这块芯⽚⾥的程序叫做”基本输入输出系统”(Basic Input/Output System ),简称为BIOS 。

它是⼀组固化到计算机内主板上⼀个ROM 芯⽚上的程序,它保存着计算机最重要的基本输⼊输出的程序、开机后⾃检程序和系统⾃启动程序,它可从CMOS 中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

2. BIOS 存储的信息

BIOS 芯⽚中主要存放:

  • ⾃诊断程序:通过读取CMOSRAM 中的内容识别硬件配置,并对其进⾏⾃检和初始化;
  • CMOS 设置程序:引导过程中,⽤特殊热键启动,进⾏设置后,存⼊CMOS RAM 中;
  • 系统⾃举装载程序:在⾃检成功后将磁盘相对0道0扇区上的引导程序装⼊内存,让其运⾏以装⼊DOS 系统;
  • 主要I/O 设备的驱动程序和中断服务:由于BIOS 直接和系统硬件资源打交道,因此总是针对某⼀类型的硬件系统,⽽各种硬件系统⼜各有不同,所以存在各种不同种类的BIOS ,随着硬件技术
    的发展,同⼀种BIOS 也先后出现了不同的版本,新版本的BIOS ⽐起⽼版本来说,功能更强。

BIOS :计算机加电⾃检完成后第⼀个读取的地⽅就是就是BIOS (Basic Input Output System ,基础输⼊输出系统),BIOS ⾥⾯记录了主机板的芯⽚集与相关设置,如CPU 与接⼝设备的通信频率、启动设备的搜索顺序、硬盘的信息、系统时间、内存信息、时钟信息、PnP 特性、外部总线、各种接⼝设备的I/O 地址、已经与CPU 通信的IRQ 中断信息,所以,启动如果要顺利启动,⾸先要读取BIOS设置。

计算机会⾸先加载BIOS 信息,BIOS 信息是如此的重要,以⾄于计算机必须在最开始就找到它。

电脑启动后,CPU 逻辑电路被设计为只能运⾏内存中的程序,没有能⼒直接运⾏存在于软盘或硬盘中的操作系统,如果想要运⾏,必须要加载到内存(RAM )中。

3. BIOS 需要在内存中加载中断向量表和中断服务程序

BIOS 程序被固化在计算机主机板上的⼀块很⼩的ROM 芯⽚⾥。现在CS:IP 已经指向了0XFFFF0 这个位置,意味着BIOS 开始启动。随着BIOS 程序的执⾏,屏幕上会显⽰显卡的信息,内存的信息,说明BIOS 程序在检测显卡,内存,这个就是POST 开机⾃检期间,有⼀项对启动操作系统⾄关重要的⼯作,那就是BIOS 在内存中建⽴中断向量表和中断服务程序BIOS 程序在内存最开始的位置(0x00000 )⽤1KB 的内存空间(0x00000~0x003FF )构建中断向量表,在紧挨着它的位置⽤256KB 的内存空间构建BIOS 数据区(0x00400~0x004FF ),并在⼤约57KB 以后得位置(0x0e05b )加载了8KB 左右的与中断向量表相应的若⼲中断服务程序。

中断向量表有256 个中断向量,每个中断向量占4个字节,其中两个字节是CS 值,两个字节是IP 值。每个中断向量都指向⼀个具体的中断服务程序。

一、启动BIOS ,准备实模式下的中断向量表和中断服务程序

电脑启动后,CPU 逻辑电路被设计为只能运⾏内存中的程序,没有能⼒直接运⾏存在于软盘或硬盘中的操作系统,如果想要运⾏,必须要加载到内存(RAM )中。

BIOS 是如何启动的,CPU 硬件逻辑设计为在加电瞬间强⾏将CS 值置为0XF000 ,IP 为0XFFF0 ,这样CS:IP 就指向0XFFFF0 这个位置,这个位置正是BIOS 程序的⼊⼝地址。

BIOS 程序被固化在计算机主机板上的⼀块很⼩的ROM 芯⽚⾥。现在CS:IP 已经指向了0XFFFF0 这个位置,意味着BIOS 开始启动。

1. POST ⾃检

BIOS 的第⼀步动作就是进⾏ 上电⾃检(POST )。

BIOS 程序⾸先检查,计算机硬件能否满⾜运⾏的基本条件,这叫做”硬件⾃检”(Power-OnSelf-Test ),缩写为POST 。

POST 的⼯作是检查硬件设备。如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中⽌。如果没有问题,随着BIOS 程序的执⾏,屏幕上会显⽰显卡的信息,内存的信息等。

电脑主机打开电源的时候,随后会听到滴的⼀声,系统启动开始了开机⾃检(POST-power on selftest )⾃检开始)

这个过程中主要是检测计算机硬件设备⽐如:CPU ,内存,主板,显卡,CMOS 等设备是否有故障存在。
如果有硬件故障的话将按两种情况理:
对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提⽰或信号;
对于⾮严重故障则给出提⽰或声⾳报警信号,等待⽤⼾处理),如果没有故障,POST 完整⾃⼰的接⼒任务,将尾部⼯作交接给BIOS 处理。

2. 初始化设备

BIOS 的第⼆步动作就是 枚举本地设备并初始化

有⼀项对启动操作系统⾄关重要的⼯作,那就是BIOS 在内存中建⽴中断向量表和中断服务程序。

BIOS 程序在内存最开始的位置(0x00000 )⽤1KB 的内存空间(0x00000~0x003FF )构建中断向量表,在紧挨着它的位置⽤256KB 的内存空间构建BIOS 数据区(0x00400~0x004FF ),并在⼤约57KB 以后的位置(0x0e05b )加载了8KB 左右的与中断向量表相应的若⼲中断服务程序。

中断向量表有256 个中断向量,每个中断向量占4个字节,其中两个字节是CS 值,两个字节是IP 值。

每个中断向量都指向⼀个具体的中断服务程序。

3. BIOS-runtime 服务按照boot 启动顺序搜索设备,寻找MBR

由于BIOS 功能使⽤上的不同,它由两个部分组成:POST 和runtime 服务。POST 完成后,它将从存储器中被清除,但是BIOS runtime 服务会被保留,⽤于⽬标操作系统。

为了启动操作系统,BIOS 的runtime 服务将搜索那些激活状态的或是可引导启动的设备,搜索的顺序则由CMOS 设置决定(也就是我们平时所谓的在BIOS 中设置的启动顺序)。⼀个软驱,⼀台光驱,⼀个硬盘上的分区,⽹络上的设备甚⾄⼀个usb 闪存盘都可以作为⼀个启动设备。

当然,linux 通常是从硬盘启动的。硬盘上的MBR (主启动记录)包含有基本的boot loader ,它是⼀个512 字节⼤⼩的扇区,位于磁盘的第⼀个扇区(0磁头0磁道1扇区)。当MBR 被装载到RAM 中后,BIOS 就会将控制权转交给MBR 。

二、引导操作系统内核并为保护模式做准备

位于MBR 中的主 boot loader 是⼀个512 字节的镜像,其中不仅包含了 bootload 程序代码,还包含了⼀个⼩的分区表。

最初的446 字节是主 boot loader ,它⾥⾯就包含有可执⾏代码以及错误消息⽂本。接下来的64 字节是分区表,其中包含有四个分区的各⾃的记录(⼀个分区占16 字节)。MBR 通过特殊数字 0xAA55(翻译成二进制则是:1010101001010101)作为两个字节的结束标志。0xAA55 同时也是 MBR 有效的校验确认。

⾸先对CPU 发送 int 0x19 中断,使CPU 运⾏int 0x19中断对应的中断服务程序,这个中断服务程序的作⽤就是把软盘第⼀个扇区的程序加载到内存的指定位置。

主 boot loader 的⼯作是寻找并加载次 boot loader (内核加载程序)

它通过分析分区表,找出激活分区来完成这个任务,当它找到⼀个激活分区时,它将继续扫描剩下的分区表中的分区,以便确认他们都是未激活的。

确认完毕后,激活分区的启动记录(次 boot loader )从设备中被读到 RAM ,并被执⾏。

说起Boot Loader,也就是在linux资料中俗称的grub。
如果我们将Boot Loader充分展开,redhat的资料⼜给我们展⽰了如下的操作系统的启动过程:
在这里插入图片描述
当然,不同的⼈不同的视⻆,在某些资料的定义中:

  • 1、 上图中红框所⽰部分,被统称为GRUB第⼀阶段引导和GRUB第1.5阶段引导。
  • 2、 ⽽后⾯的GRUB,被称为GRUB第⼆阶段引导。

但1,2合并起来,统称为GRUB引导阶段。

“主引导记录”只有512 个字节,放不了太多东西。它的主要作⽤是,告诉计算机到硬盘的哪⼀个位置
去找操作系统。主引导记录由三个部分组成:

  • 第1-446 字节:调⽤操作系统的机器码。
  • 第447-510 字节:分区表(Partition table )。
  • 第511-512 字节:主引导记录签名(0x55 和0xAA )。

其中,第⼆部分”分区表”的作⽤,是将硬盘分成若⼲个区。

1. 分区表

硬盘分区有很多好处。考虑到每个区可以安装不同的操作系统,”主引导记录”因此必须知道将控制权转交给哪个区。分区表的⻓度只有64 个字节,⾥⾯⼜分成四项,每项16 个字节。所以,⼀个硬盘最多只能分四个⼀级分区,⼜叫做“主分区”。
每个主分区的16 个字节,由6个部分组成:

  • 第1个字节:如果为0x80 ,就表⽰该主分区是激活分区,控制权要转交给这个分区。四个主分区⾥⾯只能有⼀个是激活的。
  • 第2-4 个字节:主分区第⼀个扇区的物理位置(柱⾯、磁头、扇区号等等)。
  • 第5个字节:主分区类型。
  • 第6-8 个字节:主分区最后⼀个扇区的物理位置。
  • 第9-12 字节:该主分区第⼀个扇区的逻辑地址。
  • 第13-16 字节:主分区的扇区总数。

最后的四个字节(”主分区的扇区总数”),决定了这个主分区的⻓度。也就是说,⼀个主分区的扇区总数最多不超过2的32 次⽅。

如果每个扇区为512 个字节,就意味着单个分区最⼤不超过2TB 。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利⽤的空间最⼤也不超过2TB 。

如果想使⽤更⼤的硬盘,只有2个⽅法:

  • ⼀是提⾼每个扇区的字节数,
  • ⼆是增加扇区总数。

MBR :第⼀个可开机设备的第⼀个扇区内的主引导分区块,内包含引导加载程序。

引导加载程序(Boot loader ): ⼀个可读取内核⽂件来执⾏的软件。

内核⽂件:开始操作系统的功能。

2. 引导操作系统的过程

由硬盘启动时,BIOS 通常是转向第⼀块硬盘的第⼀个扇区,即主引导记录(MBR) 。装载GRUB 和操作系统的过程,包括以下⼏个操作步骤:

  • 装载记录
    基本引导装载程序所做的唯⼀的事情就是装载第⼆引导装载程序。
  • 装载Grub
    这第⼆引导装载程序实际上是引出更⾼级的功能,以允许⽤⼾装载⼀个特定的操作系统。
  • 装载系统
    如linux 内核。GRUB 把机器的控制权移交给操作系统。

不同的是,微软操作系统都是使⽤⼀种称为链式装载的引导⽅法来启动的,主引导记录仅仅是简单地指向操作系统所在分区的第⼀个扇区。

3. 加载主引导加载程序-基本装载程序

众所周知,硬盘上第0磁道第⼀个扇区被称为MBR ,也就是Master Boot Record ,即主引导记录,它的⼤⼩是512 字节,别看地⽅不⼤,可⾥⾯却存放了预启动信息、分区表信息。

按照BIOS 所设定的系统启动流程,如果检测通过,则根据引导次序(Boot Sequence) 开始在第⼀台设备上⽀持启动程序,我们的启动设备主要包括硬盘、USB 、SD 等,我们⼀般⽤的是硬盘,然后进⾏读取第⼀个设备就是硬盘,第⼀个要读去的就是该硬盘的主引导记录MBR (Master BootRecord ),然后系统可以根据启动区安装的引导加载程序(Boot Loader )开始执⾏核⼼识别的⼯
作。

然后将控制权交给主引导代码。主引导代码的任务包括

  • 扫描分区表,找到⼀个激活(可引导)分区;
  • 找到激活分区的起始扇区;
  • 将激活分区的引导扇区装载到内存7C00 处;
  • 将控制权交给引导扇区代码;

4. 加载次引导记载程序–⾼级装载程序bootload 如GRUB

系统读取内存中的grub 配置信息(⼀般为menu.lst 或grub.lst ),并依照此配置信息来启动不同的操作系统。

这时,计算机的控制权就要转交给硬盘的某个分区了,这⾥⼜分成三种情况。

1. 情况A:卷引导记录

上⼀节提到,四个主分区⾥⾯,只有⼀个是激活的。计算机会读取激活分区的第⼀个扇区,叫做“卷引导记录”(Volume boot record ,缩写为VBR )。“卷引导记录”的主要作⽤是,告诉计算机,操作系统在这个分区⾥的位置。然后,计算机就会加载操作系统了。

2. 情况B:扩展分区和逻辑分区

随着硬盘越来越⼤,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有⼀个区可以被定义成“扩展分区”(Extended partition )。所谓“扩展分区”,就是指这个区⾥⾯⼜分成多个区。这种分区⾥⾯的分区,就叫做”逻辑分区”(logical partition )。

计算机先读取扩展分区的第⼀个扇区,叫做“扩展引导记录”(Extended boot record ,缩写为EBR )。它⾥⾯也包含⼀张64 字节的分区表,但是最多只有两项(也就是两个逻辑分区)。

计算机接着读取第⼆个逻辑分区的第⼀个扇区,再从⾥⾯的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它⾃⾝为⽌(即只有⼀个分区项)。因此,扩展分区可以包含⽆数个逻辑分区。

但是,似乎很少通过这种⽅式启动操作系统。如果操作系统确实安装在扩展分区,⼀般采⽤下⼀种⽅式启动。

4. 情况C:启动管理器

在这种情况下,计算机读取”主引导记录”前⾯446 字节的机器码之后,不再把控制权转交给某⼀个分区,⽽是运⾏事先安装的“启动管理器”(boot loader ),由⽤⼾选择启动哪⼀个操作系统。
Linux 环境中,⽬前最流⾏的启动管理器是Grub 。

Boot Loader 就是在操作系统内核运⾏之前运⾏的⼀段⼩程序。通过这段⼩程序,我们可以初始化硬件设备、建⽴内存空间的映射图,从⽽将系统的软硬件环境带到⼀个合适的状态,以便为最终调⽤操作系统内核做好⼀切准备。

Boot Loader 有若⼲种,其中Grub 、Lilo 和spfdisk 是常⻅的Loader 。

从bios/uefi到操作系统服务启动分legacy模式和UEFI模式。
Legacy时代
如果将硬件⾃检当作bios启动的前期或准备,那么传统的legacy服务器启动其实是包括以下四部分:
传统的legacy服务器启动
引导/grub ⼜分成了stage1,stage1.5,stage2三个阶段

在这里插入图片描述

在这里插入图片描述

  • Stage1
    BIOS可以知道磁盘的路径,但是BIOS不认识磁盘上的分区和⽂件系统,更不⽤说操作系统的内核⽂件了。所以Bios执⾏到最后,便闭着眼将磁盘的第⼀个扇区sector的头446字节拉到了实模式执⾏环境中。
    ⽽这446字节就是引导/grub部分的stage1,就是引导过程的⽕种。

  • Stage1.5
    从stage1的这446字节开始,所有的引导过程执⾏的很底层。在有限的执⾏空间内,以sector为单位,⼀个接⼀个的模块进⾏替代、腾挪,⼀点点的为后⾯稍复杂点的模块执⾏创造条件。
    Stage1.5的作⽤,基本上是为了:能从⽆到有的看到磁盘上的/boot⽂件系统,从⽽可以读出/boot下的grub菜单⽂件以及操作系统内核⽂件。

  • Stage2
    ⽂明时代的开始,引导过程终于拉起了grub启动菜单。

UEFI时代
在这里插入图片描述

三、加载操作系统内核

当内核映像被加载到内存中,并且次引导加载程序释放控制权之后,内核阶段就开始了。

其中加载过程需要借助 BIOS 提供的int 0x13 中断向量指向的中断服务程序来完成。该程序将软盘第⼆个扇区开始的4个扇区,即 setup.s 对应的程序加载⾄内存的 SETUPSEG (0x90200 )处。

把第⼀阶段和第⼆阶段的 boot loaders 联合起来,就是在x86 个⼈电脑中,我们所说的 linux loader (LILO )或者 GRand Unified Bootloader(GRUB) 。由于 GRUB 修正了⼀些 LILO 中
存在的缺陷,因此下⾯就让我们来看看 GRUB (如果你希望得到更多的关于 GRUB ,LILO和与之相关话题的讨论资源,请⻅⽂后的参考资料)对于 GRUB 来说,⼀个⽐较好的⽅⾯就是它包含了 linux ⽂件系统的知识。与LILO 使⽤裸扇区不同的是,GRUB 能够从 ext2 或者 ext3 ⽂件系统中加载 linux 内核。它是通过将本来两阶段的 boot loader 转换成三个阶段的 boot loader 。在第⼀阶段(MBR )中会启动 stage1.5的 boot loader 来理解 linux 内核镜像中的特殊的⽂件系统格式,例如,reiserfs_stage1-5( ⽤于从reiserf ⽇志⽂件系统中进⾏加载)或 e2fs + stage1_5 ( ⽤于从wxt2 或ext3 ⽂件系统进⾏加载)。当 stage1.5 的 boot loader 被加载并运⾏时,stage2 的 boot loader 才能被加载 。 当 stage2 被 加 载 时 , GRUB 能 根 据 请 求 的 情 况 显 ⽰ ⼀ 个 可 选 内 核 的 清 单 (在/etc/grub.conf 中 进 ⾏ 定 义 , 同 时 还 有 ⼏ 个 软 符 号 链 接 /etc/grub/menu.lst /etc/grub.conf) 。你可以选择⼀个内核,修改其附加的内核参数。同时,你可以选择使⽤命令⾏的shell 来对启动过程进⾏更深层次的⼿⼯控制。

⽤⼾选择要加载的内核之后,次引导加载程序(GRUB )就会根据/boot/grub.conf 配置⽂件中所设置的信息,从/boot/ 所在的分区上读取Linux 内核映像,然后把内核映像加载到内存中并把控制权交给Linux 内核。

linux 内核获得控制权之后开始⼲⾃⼰的事

  • 检测硬件
  • 解压缩⾃⼰并安装必要驱动
  • 初始化与⽂件系统相关的虚拟设备,LVM 或RAID
  • 装载根⽂件系统,挂在根⽬录下⾯
  • 完成之后,linux 在进程空间⾥⾯加载init 程序,下⾯轮到init ⼲活

根据grub 设定的内核映像所在路径,系统读取内存映像,并进⾏解压缩操作。此时,屏幕⼀般会输出“Uncompressing Linux” 的提⽰。当解压缩内核完成后,屏幕输出“OK, booting the kernel” 。

系统将解压后的内核放置在内存之中,并调⽤start_kernel() 函数来启动⼀系列的初始化函数并初始化各种设备,完成Linux 核⼼环境的建⽴。⾄此,Linux 内核已经建⽴起来了,基于Linux 的程序应该可以正常运⾏了。

启动第五步 ⽤⼾层init 依据inittab ⽂件来设定运⾏等级

内核被加载后,第⼀个运⾏的程序便是/sbin/init ,该⽂件会读取/etc/inittab ⽂件,并依据此⽂件来进⾏初始化⼯作。其实/etc/inittab ⽂件最主要的作⽤就是设定Linux 的运⾏等级,其设定形式是“:
id:5:initdefault: ,这就表明Linux 需要运⾏在等级5上。Linux 的运⾏等级设定如下:

Linux 系统有7个运⾏级别(runlevel) :
运⾏级别0:系统停机状态,系统默认运⾏级别不能设为0,否则不能正常启动
运⾏级别1:单⽤⼾⼯作状态,root 权限,⽤于系统维护,禁⽌远程登陆
运⾏级别2:多⽤⼾状态(没有NFS)
运⾏级别3:完全的多⽤⼾状态(有NFS) ,登陆后进⼊控制台命令⾏模式
运⾏级别4:系统未使⽤,保留
运⾏级别5:X11 控制台,登陆后进⼊图形GUI 模式
运⾏级别6:系统正常关闭并重启,默认运⾏级别不能设为6,否则不能正常启动

1. 启动内核模块

具体是依据/etc/modules.conf ⽂件或/etc/modules.d ⽬录下的⽂件来装载内核模块。

2. 执⾏不同运⾏级别的脚本程序

根据运⾏级别的不同,系统会运⾏rc0.d 到rc6.d 中的相应的脚本程序,来完成相应的初始化⼯作和启动相应的服务。

三、加载内核镜像

这个阶段,主要是vmlinuz ⽂件加载initrd ⽂件。

内核映像并不是⼀个可执⾏的内核,⽽是⼀个压缩过的内核映像。通常它是⼀个 zImage (压缩映像,⼩于 512KB )或⼀个 bzImage (较⼤的压缩映像,⼤于 512KB ),它是提前使⽤ zlib 进⾏压缩过的。在这个内核映像前⾯是⼀个例程,它实现少量硬件设置,并对内核映像中包含的内核进⾏解压,然后将其放⼊⾼端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使⽤。然后该例程会调⽤内核,并开始启动内核引导的过程。

当 bzImage (⽤于 i386 映像)被调⽤时,我们从 ./arch/i386/boot/head.S 的 start 汇编例程开始执⾏。

这 个 例 程 会 执 ⾏ ⼀ 些 基 本 的 硬 件 设 置 , 并 调 ⽤ ./arch/i386/boot/compressed/head.S 中 的 startup_32 ,设置⼀个基本的环境(堆栈等),并清除 Block Started by Symbol (BSS )。然后调⽤⼀个叫做 decompress_kernel 的 C 函数(在./arch/i386/boot/compressed/misc.c 中)来解压内核。当内核被解压到内存中之后,就可以调⽤它了。这是另外⼀个 startup_32 函数,但是这个函数在 ./arch/i386/kernel/head.S 中。

参考链接

linux操作系统引导与启动——内核启动和初始化(一)
linux操作系统引导与启动——引导(2)
linux系统启动过程详解-开机加电后发生了什么 –linux内核剖析(零)
一文搞懂 | 内核的启动
Linux内核启动流程


版权声明:本文为tiantianhaoxinqing__原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。