我想系统化我的U-Boot / linux知识。在每个嵌入式平台中是否需要至少2个引导加载程序阶段?或者后续流程可以变化吗?
第一阶段引导加载程序(可以是U-Boot)存储在处理器的ROM内部,无法更新。它将从内部缓存内存运行。此U-Boot需要(至少):初始化RAM,初始化外部闪存,初始化串行控制台,读取和运行第二阶段引导加载程序。
第二阶段引导加载程序(可以是U-Boot)存储在RW闪存中。它将处理以太网,闪存RW功能等。可以自定义和覆盖此U-Boot。主要任务是将Linux内核加载到RAM中并运行它。
linux内核启动。
第一阶段引导加载程序是否始终为只读?
答案 0 :(得分:11)
第一个引导加载程序的位置与系统有很大关系。你可能有某种usb可启动设备枚举和下载固件到ram所有硬件然后处理器从该ram启动。
通常是的,第一次启动是某种闪存。最好让第一个bootloader超级简单,基本上100%无错,耐用可靠,可能采用串行或其他方式进入,以便您可以使用它来替换第二个/真正的引导加载程序。
理想情况下,第二个引导加载程序也想要闪存,第二个引导加载程序想要完成大部分工作,初始化ddr,设置以太网,如果它想要进行某种基于以太网的调试或传输文件,bootp等等要大得多且复杂化,预计它们都会出现错误,并且需要比主引导加载程序更频繁地升级。希望保护主数据库不被覆盖,这样您就可以轻松地替换第二个引导加载程序,而不会使系统崩溃。
所有系统都使用上述功能吗?不,有些/很多人可能只使用单个引导加载程序,可能很早就会暂停,以便串行端口上的按键可以中断引导加载程序,将您带到可以重新加载引导加载程序的位置。允许引导加载程序开发的机会更少,但如果你先搞砸了第一位并且包括击键和串行闪存加载器之类的东西,那么仍然有机会。在这里,串行加载器并不总是存在,只是引导加载程序开发人员的便利。一般来说,后备将是jtag,或可移动的舞会或其他系统方式进入并重新编程舞会(当你制作电路板时,有时与系统中第一次编程时相同)可以节省成本,并在制造过程中使用预先编程的闪存,因此第一次启动工作。)
Linux bootloader不需要任何/所有这一点,一个非常非常小的设置ram,准备命令行或atags或其他任何并分支到linux。
这是一个加载的问题,因为答案很大程度上取决于您的系统,处理器,设计工程师(包括您)。传统上,处理器从闪存引导,引导加载程序获取内存和其他一些东西,以便下一部分代码可以运行。下一部分代码可以来自很多地方,usb,磁盘,flash / rom,ethernet / bootp / tftp,pcie,mdio,spi,i2c等。并且在上电复位和linux之间可以有多层连接设计的愿望或要求。
答案 1 :(得分:6)
第一阶段引导加载程序不必是只读的 - 但是如果您损坏了闪存的读写部分,则将只读引导加载程序放在具有某种恢复模式的ROM中会很有帮助。否则你需要将编程器物理连接到闪存芯片才能恢复。
答案 2 :(得分:4)
如果您使用U-Boot,可以跳过第二阶段引导加载程序以加快引导时间。换句话说,第一阶段引导加载程序(SPL)将直接加载Linux内核,跳过第二阶段引导加载程序(u-boot)。在U-Boot中,这称为Falcon Mode。