让我们先从高级的视角来查看 Linux 引导过程,这样就可以看到整个过程的全貌了。然后将回顾一下在各个步骤到底发生了什么。在整个过程中,参考一下内核源代码可以帮助我们更好地了解内核源代码树,并在以后对其进行深入分析。
当系统首次引导时,或系统被重置时,处理器会执行一个位于已知位置处的代码。在个人计算机(PC)中,这个位置在基本输入/输出系统(BIOS)中,它保存在主板上的闪存中。嵌入式系统中的中央处理单元(CPU)会调用这个重置向量来启动一个位于闪存/ROM 中的已知地址处的程序。在这两种情况下,结果都是相同的。因为 PC 提供了很多灵活性,BIOS 必须确定要使用哪个设备来引导系统。稍后我们将详细介绍这个过程。
当找到一个引导设备之后,第一阶段的引导加载程序就被装入 RAM 并执行。这个引导加载程序在大小上小于 512 字节(一个扇区),其作用是加载第二阶段的引导加载程序。
当第二阶段的引导加载程序被装入 RAM 并执行时,通常会显示一个动画屏幕,并将 Linux 和一个可选的初始 RAM 磁盘(临时根文件系统)加载到内存中。在加载映像时,第二阶段的引导加载程序就会将控制权交给内核映像,然后内核就可以进行解压和初始化了。在这个阶段中,第二阶段的引导加载程序会检测系统硬件、枚举系统链接的硬件设备、挂载根设备,然后加载必要的内核模块。完成这些操作之后启动第一个用户空间程序(init),并执行高级系统初始化工作。
这就是 Linux 引导的整个过程。现在让我们深入挖掘一下这个过程,并深入研究一下 Linux 引导过程的一些详细信息。
系统启动
系统启动阶段依赖于引导 Linux 系统上的硬件。在嵌入式平台中,当系统加电或重置时,会使用一个启动环境。这方面的例子包括 U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平台通常都是与引导监视器搭配销售的。这些程序位于目标硬件上的闪存中的某一段特殊区域,它们提供了将 Linux 内核映像下载到闪存并继续执行的方法。除了可以存储并引导 Linux 映像之外,这些引导监视器还执行一定级别的系统测试和硬件初始化过程。在嵌入式平台中,这些引导监视器通常会涉及第一阶段和第二阶段的引导加载程序。
在 PC 中,引导 Linux 是从 BIOS 中的地址 0xFFFF0 处开始的。BIOS 的第一个步骤是加电自检(POST)。POST 的工作是对硬件进行检测。BIOS 的第二个步骤是进行本地设备的枚举和初始化。
给定 BIOS 功能的不同用法之后,BIOS 由两部分组成:POST 代码和运行时服务。当 POST 完成之后,它被从内存中清理了出来,但是 BIOS 运行时服务依然保留在内存中,目标操作系统可以使用这些服务。
要引导一个操作系统,BIOS 运行时会按照 CMOS 的设置定义的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备,甚至是 USB 闪存。
通常,Linux 都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。MBR 是一个 512 字节大小的扇区,位于磁盘上的第一个扇区中(0 道 0 柱面 1 扇区)。当 MBR 被加载到 RAM 中之后,BIOS 就会将控制权交给 MBR。
第一阶段引导加载程序
MBR 中的主引导加载程序是一个 512 字节大小的映像,其中包含程序代码和一个小分区表。前 446 个字节是主引导加载程序,其中包含可执行代码和错误消息文本。接下来的 64 个字节是分区表,其中包含 4 个分区的记录(每个记录的大小是 16 个字节)。MBR 以两个特殊数字的字节(0xAA55)结束。这个数字会用来进行 MBR 的有效性检查。
主引导加载程序的工作是查找并加载次引导加载程序(第二阶段)。它是通过在分区表中查找一个活动分区来实现这种功能的。当找到一个活动分区时,它会扫描分区表中的其他分区,以确保它们都不是活动的。当这个过程验证完成之后,就将活动分区的引导记录从这个设备中读入 RAM 中并执行它。
次引导加载程序(第二阶段引导加载程序)可以更形象地称为内核加载程序。这个阶段的任务是加载 Linux 内核和可选的初始 RAM 磁盘。
内核
当内核映像被加载到内存中,并且阶段 2 的引导加载程序释放控制权之后,内核阶段就开始了。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是提前使用 zlib 进行压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。
当 bzImage(用于 i386 映像)被调用时,我们从 ./arch/i386/boot/head.S 的 start 汇编例程开始执行(主要流程图请参看图 3)。这个例程会执行一些基本的硬件设置,并调用 ./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 中。
在这个新的 startup_32 函数(也称为清除程序或进程 0)中,会对页表进行初始化,并启用内存分页功能。然后会为任何可选的浮点单元(FPU)检测 CPU 的类型,并将其存储起来供以后使用。然后调用 start_kernel 函数(在 init/main.c 中),它会将您带入与体系结构无关的 Linux 内核部分。实际上,这就是 Linux 内核的 main 函数。
通过调用 start_kernel,会调用一系列初始化函数来设置中断,执行进一步的内存配置,并加载初始 RAM 磁盘。最后,要调用 kernel_thread(在 arch/i386/kernel/process.c 中)来启动 init 函数,这是第一个用户空间进程(user-space process)。最后,启动空任务,现在调度器就可以接管控制权了(在调用 cpu_idle 之后)。通过启用中断,抢占式的调度器就可以周期性地接管控制权,从而提供多任务处理能力。
在内核引导过程中,初始 RAM 磁盘(initrd)是由阶段 2 引导加载程序加载到内存中的,它会被复制到 RAM 中并挂载到系统上。这个 initrd 会作为 RAM 中的临时根文件系统使用,并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。由于与外围设备进行交互所需要的模块可能是 initrd 的一部分,因此内核可以非常小,但是仍然需要支持大量可能的硬件配置。在内核引导之后,就可以正式装备根文件系统了(通过 pivot_root):此时会将 initrd 根文件系统卸载掉,并挂载真正的根文件系统。
initrd 函数让我们可以创建一个小型的 Linux 内核,其中包括作为可加载模块编译的驱动程序。这些可加载的模块为内核提供了访问磁盘和磁盘上的文件系统的方法,并为其他硬件提供了驱动程序。由于根文件系统是磁盘上的一个文件系统,因此 initrd 函数会提供一种启动方法来获得对磁盘的访问,并挂载真正的根文件系统。在一个没有硬盘的嵌入式环境中,initrd 可以是最终的根文件系统,或者也可以通过网络文件系统(NFS)来挂载最终的根文件系统。
Init
当内核被引导并进行初始化之后,内核就可以启动自己的第一个用户空间应用程序了。这是第一个调用的使用标准 C 库编译的程序。在此之前,还没有执行任何标准的 C 应用程序。
在桌面 Linux 系统上,第一个启动的程序通常是 /sbin/init。但是这不是一定的。很少有嵌入式系统会需要使用 init 所提供的丰富初始化功能(这是通过 /etc/inittab 进行配置的)。在很多情况下,我们可以调用一个简单的 shell 脚本来启动必需的嵌入式应用程序。
回页首
结束语
与 Linux 本身非常类似,Linux 的引导过程也非常灵活,可以支持众多的处理器和硬件平台。最初,加载引导加载程序提供了一种简单的方法,不用任何花架子就可以引导 Linux。LILO 引导加载程序对引导能力进行了扩充,但是它却缺少文件系统的感知能力。最新一代的引导加载程序,例如 GRUB,允许 Linux 从一些文件系统(从 Minix 到 Reise)上进行引导。
分享到:
相关推荐
### Linux引导过程详解 Linux操作系统启动过程是计算机科学领域中一个复杂的主题,涉及到硬件初始化、内核加载、系统服务启动等多个阶段。以下是对Linux引导过程的深入解析,旨在揭示从开机到用户界面呈现的全过程...
总的来说,Linux引导过程是一个多层次的进程,涵盖了硬件初始化、引导加载程序的交互、内核加载和初始化,以及最终的用户空间程序启动。了解这个过程对于系统管理员、开发者和硬件工程师来说至关重要,因为它允许...
【Linux引导过程详解】 Linux操作系统启动过程是一个复杂而有序的序列,从硬件初始化到最终用户界面的呈现,涉及多个关键步骤。以下是对Linux引导过程和服务的详细解释: 1. **BIOS初始化** - **BIOS**(基本输入...
引导 Linux® 系统的过程包括很多阶段。不管您是引导一个标准的 x86 桌面系统,还是引导一台嵌入式的 PowerPC® 机器,很多流程都惊人地相似。 引导 Linux® 系统的过程包括很多阶段。不管您是引导一个标准的 x86 ...
在理解Linux引导过程时,首先要明白,无论是哪种类型的计算机,启动流程都是从CPU执行第一条指令开始。在个人电脑(PC)上,这条指令通常位于基本输入输出系统(BIOS)中。BIOS进行硬件自检(POST),检查内存、硬盘...
Boot Sequence Overview 1. BIOS 电脑打开电源时就会进入BIOS,主要监测CPU,Memory,风扇等 2.MBR Boot loader 在磁盘的第1个磁区共512bytes,其中前446bytes用于选择启动的 bootPartition 载入开机的程式码 ...
启动加载器(如GRUB或LILO)是Linux引导过程的关键组件,它的任务是从硬盘或其他存储设备上加载操作系统内核。用户可以通过启动加载器选择要启动的操作系统版本或恢复模式。例如,当安装Ubuntu Linux时,用户可以...
Linux系统的引导过程是一个复杂但至关重要的过程,它涉及到计算机硬件的初始化、操作系统的加载以及内核的启动。本文将详细解析这一过程。 首先,当计算机加电后,硬件开始进行基本输入输出系统(BIOS)的自检程序...
### Linux的引导过程详解 #### 一、引导过程概览 Linux系统的引导过程是指从开机启动至用户可以使用系统的整个过程。这一过程涉及到多个阶段,包括但不限于BIOS启动、第一阶段引导加载程序(如MBR)、第二阶段引导...
理解Linux引导过程对于系统管理员、开发者以及任何对系统底层运作感兴趣的人来说都至关重要,它有助于故障排查、性能优化以及自定义引导流程。以上描述的只是引导过程的概览,实际的引导过程可能因具体配置和系统...
Linux操作系统的引导过程是计算机启动过程中至关重要的一环,它涵盖了从CPU上电初始化到操作系统内核启动并接管系统的整个流程。下面将详细阐述这一过程。 首先,Linux启动的第一步是CPU上电初始化。CPU在电源接通...
### Linux内核引导过程详解 #### 一、概述 Linux内核引导过程是操作系统启动过程中一个非常关键的步骤。在这一过程中,内核通过一系列复杂的初始化操作,为系统的正常运行奠定基础。本文将深入探讨Linux内核的引导...
嵌入式 Linux 系统的引导过程及启动代码分析 嵌入式 Linux 系统的引导过程是指从系统启动到内核初始化的整个过程。这个过程涉及到多个阶段,包括引导加载程序、内核初始化、文件系统挂载、init 进程执行等。 在...
引导启动过程是计算机启动时加载操作系统的步骤,而Linux引导修复主要针对由于各种原因导致的启动问题,如误操作、系统更新或硬盘故障等。Boot Repair是一款实用工具,专为Linux用户设计,用于解决与GRUB(GRand ...
关于Linux系统的启动过程分享一下,内容是关于Linux的
本文主要探讨的是Linux引导过程中的两项关键技术:初始化内存盘(Initrd)和内核支持压缩的文件系统映像,这些技术使得Linux系统能够在内存中运行,从而避免因硬盘文件系统损坏导致的启动问题。 1. **初始化内存盘...
本文将深入探讨这一过程,帮助读者理解Linux引导的各个环节。 首先,引导程序是启动过程的起点,它负责将操作系统加载到内存并启动。在Linux中,常见的引导程序有GRUB和LILO。当计算机开启,BIOS(Basic Input/...
通过详细介绍启动过程中涉及的关键文件和技术细节,帮助读者更好地理解 Linux 系统的引导机制及其相关组件。 #### 关键词 - POST (Power-On Self Test) - BIOS (Basic Input/Output System) - LILO (Linux Loader)...
这就涉及到如何安全地删除Linux引导界面的问题,以下将详细说明删除Linux引导界面的方法以及需要特别注意的事项。 首先,了解什么是Linux引导界面。Linux引导界面是指在计算机启动时出现的界面,它允许用户选择启动...