重启过程如何在运行Linux的ARM SOC上运行,??
目前使用的典型ARM处理器与外设集成在单个IC上,称为SoC,片上系统。通常,重启过程几乎与开机启动过程相同。在复位时,ARM处理器通常会跳转到地址0。
主存储器,例如DRAM和非易失性存储器,例如, NAND闪存通常位于SoC外部(具有Linux功能),可实现最大的设计灵活性
但通常有一个小的(可能是128KB)嵌入式ROM(只读存储器)来初始化最小系统组件(例如时钟,外部存储器)以开始自举操作。处理器复位将导致执行此引导ROM。 (该ROM是真正的只读,不能修改。在芯片制造过程中,代码被掩盖在硅片中。)
SoC可能有一个捆绑选项来代替执行外部启动存储器,例如NOR闪存或EEPROM,它们可以直接执行(即XIP,就地执行)。
第一阶段引导程序使用的任何ROM,闪存和SRAM的显着特征是在复位后必须立即访问这些存储器。
引导使用DRAM作为主存储器的系统的一个问题是其硬件初始化。在将代码加载到DRAM中并执行之前,必须用特定于板的参数初始化DRAM存储器控制器。那么这个特定于电路板的初始化代码从何处执行,因为它不能存在于主存储器中?
每个供应商都有自己的解决方案
有些要求将存储器配置数据存储在非易失性存储器中以供引导ROM访问
一些SoC集成了SRAM(不需要像DRAM这样的初始化)来执行一个小的第二阶段自举程序
一些SoC使用NOR闪存来保存XIP(就地执行)引导程序(例如U-Boot的SPL程序)。
每个SoC供应商都有自己的引导方法来加载和执行操作系统
有些使用硬件捆绑读取GPIO引脚来确定引导序列下一阶段的来源
另一个供应商可以使用有序的存储器和设备列表来探测引导程序
另一种技术是分支到NOR闪存中的固件,可以直接执行(即XIP,就地执行)。
一旦引导程序初始化了DRAM,那么这个主存储器可用于加载下一级引导。这可能是一个复杂的启动实用程序,如U-Boot,或者(如果引导程序能够)Linux内核。 ROM引导程序可以完成加载ARM Linux内核(例如ETRAX)的所有操作,但更常见的是在处理器重置与执行OS之间会有多个引导程序或阶段。
以下文档中详细说明了引导Linux ARM内核的要求:Booting ARM Linux
较早版本的Linux ARM使用ATAG列表将基本配置信息传递给内核。现代版本使用设备树的编译二进制文件提供完整的电路板配置。
...例如,引导装载程序是否重新初始化DDR内存?
在我看到的几个例子中,启动程序无条件地配置动态RAM控制器。
PC具有BIOS和开机自检,即POST。 POST的执行是上电复位(又称冷启动)与软件复位(也称为热启动或重启)之间的主要区别。 ARM系统通常不执行POST,因此您通常会看到重置类型之间的差异很小甚至没有差异。