我在这里阅读了这篇关于 x64 启动过程的信息丰富的博客文章。ARM 上的引导过程在哪些方面有所不同?我看了一下 Raspberry pi,似乎 GPU 是在控制权移交给 ARM 处理器之前执行的。您是否遇到过有关 ARM 处理器的类似资源?
1 回答
就像 x86 引导过程记录在 intel.com 上提供的文档中一样,arm 引导过程记录在 arm.com 上,任何其他处理器也记录在案。
全尺寸(非皮质-m)臂核心首先在地址零处执行以进行复位。有一个用于复位的指令位置,一个用于数据中止、未定义指令等。类似于中断向量表,但不是地址,而是一条指令,理想情况下是分支。
处理器历来有一些非易失性 ram 映射到引导空间或向量表或其他任何地方,然后是易失性 ram(如果有的话)。x86 历史上靠近 ram 的顶部,底部的 arm。
ARM 不像 intel 那样制造芯片,它设计的处理器核心是其他制造芯片的人在他们的芯片设计中包含的,而不是必须设计自己的核心和维护编译器等。因此芯片供应商可以通过多种方式解决启动过程方式,有些东西有一些非易失性映射低然后在启动后你可以将ram交换到那个地址空间,无论如何。以 Broadcom 制造的 Raspberry Pi 芯片为例,它们有自己的 gpu 来实际启动芯片,它最终会读取一个假定为 linux 内核和根文件系统的文件,但并非必须如此。它将文件放在 ram(默认情况下)中,Linux 内核将由引导加载程序(如 redboot 或 uboot)加载的位置,在这种情况下,由 gpu 的 arm 加载程序加载。然后 gpu 放置一些面包屑,包括分支到 linux 内核所需的重置指令(通常是一件非常微不足道的事情),然后在 arm 内核上释放重置以允许它启动。所以基本上 arm 只看到 ram 这有点好,但这对于 arm 或其他处理器来说有点不典型。通常,主处理器从非易失性存储(eeprom、闪存等)启动,然后自己加载 linux 或其他任何东西并分支到它。
许多其他处理器类型将具有中断向量表,包括 arm cortex-m 系列,它们是仅限拇指指令集的内核。它们被设计为微控制器,不会带来太多开销,所以第一个地址槽实际上是用来填充堆栈指针的初始值,然后第二个是复位地址,然后是无数其他地址。硬件旨在为您保留寄存器,以便您可以在表中获得 C 函数的地址,而不必由您或将工具链移植到该平台的人编写的“一些需要汇编”的包装器。其他处理器类型将只有一个向量表,并且需要一些程序集来包装中断等。