Booting ARM Linux

原版英文文档位置: \linux-4.9.145\Documentation\arm\Booting

启动ARM Linux
=================

作者:Russell King
日期:2002年5月18日
以下文档与2.4.18-rmk6及更高版本相关。
为了引导ARM Linux,您需要一个boot loader,它是一个在主内核之前运行的小程序。期望boot loader初始化各种设备,并最终调用Linux内核,将信息传递给内核。

基本上,boot loader应提供(至少)以下内容:

1.设置并初始化RAM。
2.初始化一个串口。
3.检测机器类型。
4.设置内核boot loader。
5.加载initramfs。
6.调用内核映像。


1.设置并初始化RAM
---------------------------

现有的boot loaders:强制
新的boot loaders:强制

期望boot loader找到并初始化内核将用于系统中的易失性数据存储的所有RAM。它以机器相关的方式执行此操作。 (它可以使用内部算法自动定位和调整所有RAM的大小,或者它可以使用机器中RAM的知识,或者boot loader设计者认为合适的任何其他方法。)


2.初始化一个串口
-----------------------------

现有的boot loaders:可选,推荐
新的boot loaders:可选,推荐

boot loader应初始化并启用目标上的一个串行端口。这允许内核串行驱动程序自动检测哪一个串口应该用于内核控制台(通常用于调试目的或与目标通信)。

作为替代方案,boot loader可以通过指定端口的标记列表将相关的“console=”选项传递给内核,串行格式选项的描述位于:

       Documentation/kernel-parameters.txt.


3.检测机器类型
--------------------------

现有的boot loaders:可选
新的boot loaders:强制,除了DT-only 平台

boot loader应通过某种方法检测其运行的机器类型。无论这是硬编码值还是某些查看连接硬件的算法超出了本文档的范围。boot loader最终必须能够向内核提供MACH_TYPE_xxx值。 (参见 linux/arch/arm/tools/mach-types)。这应该传递给内核寄存器r1中。

对于 DT-only 平台,机器类型将由设备树确定。将机器类型设置为全部类型(~0)。这不是严格必要的,但可以确保它不会与任何现有类型匹配。

4.设置启动数据
------------------

现有的boot loader:可选,高度推荐
新的boot loader:强制

boot loader必须提供标记列表或dtb映像,以便将配置数据传递给内核。引导数据的物理地址传递给内核寄存器r2中。

4a。设置内核标记列表
--------------------------------

boot loader必须创建并初始化内核标记列表。有效的标记列表以ATAG_CORE开头,并以ATAG_NONE结尾。 ATAG_CORE标记可能为空,也可能不为空。空ATAG_CORE标记的大小字段设置为“2”(0x00000002)。 ATAG_NONE必须将size字段设置为零。

可以在列表中放置任意数量的标签。未定义重复标记是否附加到前一个标记所携带的信息,或者是否替换了全部信息;一些标签的行为与前者相同,其他标签则与后者相同。

boot loader必须至少传递系统内存的大小和位置以及根文件系统位置。因此,最小标记列表应如下所示:

    +-----------+
base ->    | ATAG_CORE |  |
    +-----------+  |
    | ATAG_MEM  |  | increasing address
    +-----------+  |
    | ATAG_NONE |  |
    +-----------+  v

标记列表应存储在系统RAM中。

标记列表必须放在内核解压缩程序和initrd'bootp'程序都不会覆盖的内存区域中。推荐的位置在第一个16KiB的RAM中。

4b。设置设备树
-------------------------

boot loader必须将设备树映像(dtb)加载到64bit地址对齐的系统ram中,并使用引导数据对其进行初始化。 dtb格式记录在Documentation/devicetree/booting-without-of.txt中。内核将在dtb物理地址处查找0xd00dfeed的dtb magic值,以确定是否已传递dtb而不是标记列表。

boot loader必须至少传递系统内存的大小和位置以及根文件系统位置。必须将dtb放在内核解压缩程序不会覆盖的内存区域中,同时保留在内核的低内存映射所覆盖的区域内。

安全位置就在从RAM开始128MiB边界之上。

5.加载initramfs。
------------------

现有的boot loader:可选
新的boot loader:可选

如果正在使用initramfs,那么与dtb一样,它必须放在内核解压缩程序不会覆盖内存区域中,同时还要覆盖内核的低内存映射所覆盖的区域。

一个安全的位置就在设备树块的上面,它本身将从RAM的开始加载到128MiB边界之上,就像上面推荐的那样。


6.调用内核映像
---------------------------

现有的boot loader:强制
新的boot loader:强制

调用内核zImage有两个选项。如果zImage存储在闪存中,并且正确链接以便从闪存运行,那么boot loader直接调用闪存中的zImage是合法的。

zImage也可以放在系统RAM中并在调用。内核应该放在RAM的第一个128MiB中。建议将其加载到32MiB以上,以避免在解压缩之前重新定位,这将使引导过程稍微加快。

引导原始(非zImage)内核时,约束更严格。在这种情况下,在这种情况下,内核必须以偏移量等于TEXT_OFFSET - PAGE_OFFSET加载到系统中。

无论如何,必须满足以下条件:

 - 禁止所有具有DMA能力的设备,这样内存就不会被伪造的网络数据包或磁盘数据损坏。这将为您节省数小时的调试时间。

 -  CPU寄存器设置
  r0 = 0,
  r1 =上述(3)中发现的机器类型编号。
  r2 =系统RAM中标记列表的物理地址,或系统RAM中设备树块(dtb)的物理地址

 -  CPU模式
  必须禁用所有形式的中断(IRQ和FIQ)

  对于不包含ARM虚拟化扩展的CPU,CPU必须处于SVC模式。 (Angel特殊例外)


  支持虚拟化扩展的cpu可以在HYP模式下进入,以便内核能够充分利用这些扩展。这是此类CPU的推荐引导方法,除非预先安装的虚拟机管理程序已在使用虚拟化。

  如果内核由于任何原因未进入HYP模式,则必须以SVC模式进入。

 - Caches, MMUs
  MMU必须关闭。
  指令缓存可以打开也可以关闭。
  数据缓存必须关闭。

  如果内核以HYP模式进入,则除普通PL1(特权内核模式)配置外,上述要求也适用于HYP模式配置。此外,必须禁用进入管理程序的所有陷阱,并且必须为所有外围设备和CPU资源授予PL1访问权限,这在架构上是可行的。除了进入HYP模式之外,系统配置应该是这样的,即不包含对虚拟化扩展的支持的内核可以在没有额外帮助的情况下正确启动。

 - boot loader应通过直接跳转到内核映像的第一条指令来调用内核映像。

  在支持ARM指令集的CPU上,入口必须配置为ARM状态,即使对于Thumb-2内核也是如此。
  
  在仅支持Thumb指令集(如Cortex-M类CPU)的CPU上,入口必须配置为Thumb状态。

猜你喜欢

转载自blog.csdn.net/sunqian666888/article/details/85089789