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