linux - 为什么我们需要嵌入式设备中的引导加载程序?

标签 linux embedded arm bootloader

我正在 ARM cortex-A8 上使用 ELinux 内核。

我知道引导加载程序如何工作以及它在做什么。但我有一个问题 - 为什么我们需要引导加载程序,为什么要诞生引导加载程序

为什么我们不能在没有bootloader的情况下直接将内核从闪存加载到RAM中?如果我们加载它会发生什么?其实processor是不会支持的,但是为什么要走流程呢?

最佳答案

在 Linux 环境中,引导加载程序负责一些预定义的任务。因为这个问题是标记,我认为 ARM booting可能是有用的资源。具体来说,引导加载程序负责设置一个 ATAG 列表,该列表描述了 RAM 的数量、内核命令行和其他参数。最重要的参数之一是机器类型。使用设备树,可以传递板的完整描述。如果没有一些代码来设置所描述的参数,这使得普通的 ARM Linux 无法启动。

这些参数允许一个 generic Linux 支持多个设备。例如,ARM Debian 内核可以支持数百种不同的主板类型。 Uboot 或其他引导加载程序可以动态确定此信息,也可以为开发板硬编码。

您可能还想看看 bootloader info堆栈溢出时的页面。

基本系统可能能够设置ATAGS 并将NOR 闪存复制到SRAM。但是,它通常比这复杂一点。 Linux 需要 RAM 设置,因此您可能需要初始化 SDRAM Controller 。如果您使用 NAND 闪存,则必须处理坏 block 并且复制 可能比memcpy() 复杂一点。

Linux 通常有一些潜在的驱动程序错误,驱动程序会假定时钟已初始化。例如,如果 Uboot 总是为特定机器初始化以太网时钟,Linux 以太网驱动程序可能会忽略设置此时钟。对于时钟树尤其如此。

有些系统需要 Linux 不支持的引导镜像格式;例如,可以立即初始化硬件的特殊 header ;比如配置 devices 来读取初始代码。此外,通常有需要立即配置的硬件; 引导加载程序 可以快速执行此操作,而 Linux 的正常结构可能会显着延迟此操作,从而导致 I/O 冲突等。

从实用的角度来看,使用引导加载程序更简单。但是,没有什么可以阻止您更改 Linux 的源代码以直接从中引导;虽然它可能就像将 引导加载程序 代码直接粘贴到 Linux 的启动。

另请参阅:Coreboot , Uboot , 和 Wikipedia's comparison . Barebox是一个鲜为人知但结构良好的现代 ARM 引导加载程序。 RedBoot也用于一些ARM系统;内核树支持 RedBoot 分区。

关于linux - 为什么我们需要嵌入式设备中的引导加载程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15548004/

相关文章:

linux - Linux 的命令行 RESTful 服务调用程序?

c++ - 在 Linux 系统调用中的 C 程序中出现错误 ‘\342’ stray ‘\210’ stray ‘\222’

c++ - 自定义 C++ 类可以复制内置类型的性能吗?

python - 用 Python 听 USB 键盘

c++ - 从 arm 程序集调用 c 函数时堆的地址发生了变化?

java - LoadLibrary 仅在从 eclipse 和 tomcat 运行时失败

php - 如何在共享服务器上使用 wkhtmltopdf

c - 用于 MSP430FR5969 的串口

c++ - 如何从 gcc 内联 arm7 程序集调用 c++ 成员函数

makefile - ELF 符号表中缺少源文件 - 如何包含它们?