This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux:Linux 设备驱动程序、BIOS、引导加载程序、initrd - initramfs

Guru**** 2583825 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/595339/linux-linux-device-drivers-bios-bootloader-initrd---initramfs

工具/软件:Linux

您好!

我对 Linux 内核和引导过程有几个问题。

1) BIOS:启动时、执行处理器启动地址上的第一个代码、即 BIOS。 BIOS 检测硬件并执行开机自检。 然后,它加载第一阶段引导加载程序(从 MBR),将控制权移交给它。 现在的问题是、如果 BIOS 执行 POST 或读取 MBR、则意味着它应该包含与 RAM、键盘、硬盘、USB 通信的驱动程序。 也就是说,是否需要设备驱动程序来检测/与这些硬件通信... 所以

i) BIOS 是否包含任何驱动程序??

ii)它如何检测 硬件并执行开机自检或与硬盘、RAM 等通信??

2) initrd - initramfs:我听说设备驱动程序打包在内核中。 内核会在引导时加载它们。 内核加载后、内核会装载名为 initrd 或 initramfs 的临时 RAMDISK 文件系统、以加载设备驱动程序并装载实际的丁腈系统。 现在、如果器件驱动程序打包到内核中、那么当引导加载程序将内核映像加载到 RAM 中时、这是否意味着内核中打包的驱动程序过多地加载到 RAM 中、如果是、为什么内核需要临时根文件系统来加载驱动程序?

3)引导加载程序:如果引导加载程序正在从硬盘驱动器将内核映像加载到 RAM 中、则意味着它应该包含用于硬盘驱动器的设备驱动程序。 那么为什么内核需要加载 RAID 控制器和驱动程序?? 引导加载程序是否应将驱动程序切换至内核???

此致、

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Amimal Khan:

    由于您已在 TI 论坛上发布此查询、我将讨论基于 TI 的嵌入式 SOC (片上系统)。
    i) BIOS 是否包含任何驱动程序??
    我)是的。 由于这是一个 TI 论坛、我们来讨论特定于常见 TI 芯片组的芯片组、如 DaVinci 和 Sitara SOC 芯片组。 它们具有与 BIOS 类似的 RBL (只读引导加载程序、用户/开发人员无法写入其中)。 它从介质(如 SDCard、NAND、eMMC、USB、以太网、UART)中拾取第一级引导加载程序(在 TI SOC 世界中称为 MLO、SPL、xloader 等)、具体取决于硬件开关、可以更改硬件开关以使其选择其中一个引导选项。 回到这个问题、是的、RBL(BIOS)有一组驱动程序(可能不是 Linux 驱动程序、而是一段代码与硬件交互并使其正常工作)。 TI 可以访问他们使用的 RBL 代码、我在这个论坛中看到过、很少有 TI 人员在内部引用代码并给出指示。 此外、TRM (技术参考手册)详细介绍了支持的硬件类型(如 NAND 类型等)

    ii)它如何检测硬件并执行开机自检或与硬盘、RAM 等通信??
    我在前面的回答中提到过、它读取一个引导开关、我们可以对其进行设置。 然后、根据 SDCard 或 NAND 等介质集、第一级引导加载程序预计位于特定偏移(NAND 位于0x00地址、尽管支持的 NAND 配置列表将以 TRM 指定)或格式(在大多数 TI 案例中、 它可以读取包含第一级引导加载程序的 FAT32分区 SDCard)。 因此、所连接的 NAND 或所使用的 SDCard 应该有一个预定义的要求(大多数 NAND 器件或 SDCard 类型都满足这个要求)。 嵌入式 SOC 没有任何特定于 POST 的功能。

    III)Now if device drivers are packed into kernel、so when bootloader load kernel image into RAM、does it does it means the drivers that ware packed inside kernel are too loaded into RAM、if then the kernel who need a temporary root file system to load drivers?(如果是、引导加载程序需要临时根文件系统来加载驱动程序?)
    ME)在嵌入式世界中、我们并非总是使用 RAMDISK (临时文件系统)。 但在桌面等一般用途中,安装根文件系统的介质可能会有所不同。 因此、很难使内核(内核大小将会增加)内包含所有驱动程序。 因此它使用初始 ramdisk,它具有工具和可加载模块,用于检测存在根文件系统的介质并加载它们。 由于在类似桌面的环境中,根文件系统可以存储在任何可用介质中,因此 ramdisk 起着至关重要的作用。 在嵌入式环境中、它有助于从 RAM 快速引导和运行应用程序、因为它比从存储在辅助存储器中的根文件系统运行更快。

    IV)引导加载程序:如果引导加载程序正在从硬盘驱动器将内核映像加载到 RAM 中、则意味着它应该包含用于硬盘驱动器的设备驱动程序。 那么为什么内核需要加载 RAID 控制器和驱动程序?? 引导加载程序是否应将驱动程序切换至内核???
    ME)引导加载程序顾名思义、是在引导时运行以加载操作系统软件的一段代码。 它是一段代码、比 BIOS (RBL 代码)功能更强大。 实际上、由于连接的外设可能会有所不同、存储操作系统软件的介质也可能有所不同、因此我们需要一个引导加载程序来初始化足够的外设和存储器以加载操作系统。 但需要记住的是、引导加载程序不能非常大且通用。 它必须是特定于电路板的(具有给定的外设和存储器集)。 回到移交驱动程序的问题(尽管这似乎是一个好主意)、与 Linux 内核相比、引导加载程序是一个简单的代码。 分层和抽象以及 API 在内核和引导加载程序之间是不同的。 引导加载程序中的驱动程序代码可能很简单、不适合 Linux 内核等更分层的代码、也不适合该代码的完整版本。 但是、诸如设置视频、成像子系统等外设时钟和引脚多路复用等的初始化步骤可在引导加载程序中执行一次、无需在 Linux 内核中再次设置。 虽然有两组驱动程序、一组在引导加载程序中、另一组在内核中、似乎是冗余的、但考虑到 Linux 驱动程序的上述点与简单的引导加载程序代码相比是通用的、分层的、也是成熟的、这似乎是合理的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Dwarakesh。

    你的答复确实是非常全面和翔实的。 我只有一个查询... 关于您的答案、即 initrd ramdisk... 您说过我们可以在内核中打包所有驱动程序、但会增加内核大小。 但在这里、我们通过保留不太重要的驱动程序和模块来减小内核大小、但我们将它们打包到另一个映像 initrd 中。 因此、加载一个大文件(内核)或一个文件(分为两个映像(内核和 initrd)的净时间不会相同???

    装入临时文件系统(initrd),然后装入真正的根文件系统,这并不奇怪。 这是因为我们需要驱动程序来加载根文件系统吗??? 如果是,则从何处装载 initrd?? 不是从同一磁盘???? 如果我的根文件系统与 initrd 位于同一硬盘驱动器上,那么您不认为我们可以跳过 initrd,因为我们不需要任何新的驱动程序来装载 root 文件系统....

    您能不能详细说明一下您提到的关键字..."引导开关"..

    BTW 到底安装什么????? 根文件系统存在于次要存储上,它保留在那里,那么安装意味着什么???? 我确信它不像处理从辅助存储到 RAM 的根文件系统(FHS)。 我的意思是,我们正在通过复制和解压缩 initrd 来装载根文件系统,从而执行非常繁重的任务。 如果挂载只是一个位于磁盘上的链接文件;到内核、那么为什么它这么重、以及安装字的含义是什么????
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Amimal、

    根据我的理解,此 initrd 是作为 Desktop 发行版中的一个概念开始的,在该发行版中,他们可以使用出厂时的单个内核映像。 稍后可以将 initrd 相应地更改为不同的硬件组合。 但在嵌入式系统中、这没有任何意义。

    对于嵌入式系统、内核和 initrd 可以来自 NOR 闪存(更快的读取速度和更昂贵的代码、因此尺寸很小、只能容纳内核和 initrd)、文件系统可以来自 NAND (更便宜、更慢的闪存)。 这提供了一种加快加载的方法、因为内核和 initrd 可以来自与 NOR 类似的另一种更快的介质。

    在减小内核大小方面、我同意您的看法、即总大小是相同的。 但略有差异:

    有两个部分需要在启动时快速启动。 正在加载和运行(正在执行)。 加载总和可以保持不变、因为大小(要加载以实现相同功能的映像的大小)保持不变、但区别在于运行(执行)的顺序。 应用程序(定义软件的主要用途)出现在用户空间中、而内核提供管理工作。 因此、如果没有应用程序、仅内核不能用于最终产品。 因此、要启动应用程序、我们需要加载内核、加载文件系统以访问 userspace 应用程序、然后运行它们(这是 Linux 的工作方式。 在 Linux 中、一切都是从 Unix 继承的文件类比)。 现在减小了内核的大小、有助于减少执行代码(在引导时初始化代码)。 精简内核意味着在引导时减少初始化。 下一步是减少安装存储在辅助存储器(如 NAND、SDCard、硬盘等)中的文件系统所需的时间

    当有大量数据(文件)需要存储和访问时、为了简化操作、文件系统可用。 文件系统提供了一种排列文件的方法和访问文件的方法。 您可以将文件系统视为存储在存储介质中的结构,以便快速查找和访问所需的文件。 内核是单个二进制文件、但用户空间可以有 N 个二进制文件、守护程序、文件等 并且有 N 个文件系统用于不同用途和不同的存储介质。

    安装是内核(代表用户空间)评估存储介质类型、介质中存在的文件系统类型、该介质访问类型等的步骤 内核尝试在 RAM 中维护该文件系统的副本(不是二进制文件或文件、而是文件系统的小细节)。 因此内核有一个块驱动程序(NAND 驱动程序或 SDCard 驱动程序)来访问介质、然后有一个文件系统驱动程序来读取/访问文件、然后有虚拟文件系统(用于抽象)、然后有分页/高速缓存用于性能等

    现在、我们已经详细介绍了安装和文件系统的过程、我们将了解 ramdisk (ramfs)提供的易用性。 首先、与 NAND、硬盘、SDCard 等辅助存储相比、RAM 的存取存储器速度更快 其次、它消除了块驱动程序、文件系统驱动程序及其开销的需要。 仅存在虚拟文件系统和分页/缓存机制。 这样可以更快地访问和运行文件。

    现在、如果我们的应用程序位于 ramfs 中、访问和执行速度是否会更快? 因此、在嵌入式系统中、除了具有用于安装根文件系统的内核驱动程序外、ramfs 还可以拥有能够更快、更快速地运行的应用程序。

    稍后、应用程序运行后、内核的其余组件可以作为模块加载。 和 rootfs。

    引导开关是许多嵌入式硬件中提供的跳线设置、用于通知 RBL (BIOS)代码在何处查找第一级引导加载程序。 它有助于引导。 这是一种有助于降低 RBL (BIOS)复杂性的方法、它可以快速识别加载第一级引导加载程序的介质。