第一阶段引导加载程序(可以是U-Boot)存储在处理器的ROM中,无法更新。它将从内部缓存存储器运行。该U-Boot需要(至少):初始化RAM,初始化外部闪存,初始化串行控制台,读取并运行第二阶段引导加载程序。
第二阶段引导加载程序(可以是U-Boot)存储在RW闪存中。它将处理以太网、闪存RW功能等。该U-Boot可以定制和覆盖。主要任务是将Linux内核加载到RAM中并运行。
Linux内核启动。
第一阶段引导加载程序(可以是U-Boot)存储在处理器的ROM中,无法更新。它将从内部缓存存储器运行。该U-Boot需要(至少):初始化RAM,初始化外部闪存,初始化串行控制台,读取并运行第二阶段引导加载程序。
第二阶段引导加载程序(可以是U-Boot)存储在RW闪存中。它将处理以太网、闪存RW功能等。该U-Boot可以定制和覆盖。主要任务是将Linux内核加载到RAM中并运行。
Linux内核启动。
在系统中,第一个引导加载程序的位置和方式很大程度上取决于系统。您可能有一种可启动的USB设备,它会在硬件中枚举并下载固件到RAM中,然后处理器会从该RAM中启动。
通常情况下,第一次引导是某种闪存。最好让第一个引导加载程序非常简单,基本上100%无故障且耐用可靠,并且具有串行或其他方式,以便您可以使用它来替换第二个/真实的引导加载程序。
理想情况下,第二个引导加载程序也应该是闪存,第二个引导加载程序将要做的大部分工作包括初始化DDR、设置以太网(如果需要进行以太网调试或文件传输)、BOOTP等。由于第二个引导加载程序更大、更复杂,所以预计它会存在缺陷并需要更频繁地升级比主引导加载程序。希望主引导加载程序受到保护不被覆盖,以便在替换第二个引导加载程序时不会砖化系统。
所有系统都使用以上方法吗?不是都这样,有些/很多只使用一个引导加载程序,可能在早期会有一些暂停,因此串口上的按键可以中断引导加载程序,带您到一个可以重新加载引导加载程序的地方。这样可以减少砖化的机会,但如果在串口和闪存加载器之前以及包括它们两者之间的内容出现问题,则仍有砖化可能。在这里,串行加载程序并不总是存在,对于引导加载程序开发人员来说只是一种方便。通常备用方案是JTAG、可移动PROM或其他系统方式,在砖化时重新编程PROM(还有,有时可以使用相同的方式在系统中第一次编程,当制造板子时,某些设计是可砖化的,以节省成本并在制造过程中使用预编程闪存,以使第一次启动正常运行)。
Linux引导加载程序不需要所有这些功能,非常非常简化,设置RAM,准备命令行或atags或其他内容,然后跳转到Linux。
这个问题的答案取决于您的系统、处理器和设计工程师(包括您),因此是一个问题带有主观性。传统上,处理器从闪存启动,引导程序获取内存和其他一些东西,以便接下来的代码可以运行。该代码可以来自许多地方,例如usb、磁盘、闪存/只读存储器、以太网/bootp/tftp、pcie、mdio、spi、i2c等。并且在电源复位和Linux启动之间可能有任意数量的层级,具体取决于设计的需求。
第一阶段的引导程序不一定是只读的 - 但将只读引导程序与某些恢复模式放在ROM中,以防您损坏了可写部分的闪存,这样有帮助;否则,您需要物理连接编程器到闪存芯片才能进行恢复。