如何通过ROM代码找到u-boot启动指令

时间:2018-02-22 11:55:00

标签: linux arm embedded-linux u-boot

我正在尝试了解ARM Linux Boot Process。

这些是我理解的:

  • 当在任何处理器中按下复位按钮时,它会跳转到复位向量或地址,对于ARM,它是0x00或0xFFFF0000。
  • 此位置包含启动代码或ROM代码或引导ROM代码

我的查询是这个Boot ROM代码如何获取u-boot第一条指令的地址?

2 个答案:

答案 0 :(得分:2)

这取决于SoC,用于引导的方案将从一个SoC到另一个不同。它通常记录在SoC的参考手册中,它描述了各种约定(从特定地址读取u-boot的位置)特定于此SoC的u-boot端口应该遵循以便ROM中的代码能够加载u-boot,最终将控制转移到u-boot。

ROM中的代码可以执行以下操作:
- 如果引脚x为0,则从eMMC的第一个扇区读取64KiB到片上静态RAM,然后将控制转移到位于OCRAM的偏移256处的代码。例如。
- 如果引脚x为1,则将UART配置为19200波特,8位奇偶校验,无停止位,尝试使用X-MODEM协议从串行端口读取64KiB进入OCRAM,然后将控制转移到代码位于OCRAM的偏移256处。

这个代码通常被命名为辅助程序加载器(SPL),然后负责配置SDRAM控制器,然后读取非代码。 SPL部分u-boot进入SDRAM的开始,然后跳转到SDRAM中的特定地址。给定SoC的SPL应足够小,以适应SoC片上RAM。在这种情况下,ROM代码将是主引导加载程序。

例如,对于TI AM335x Cortex-A8 SoC,Technical Reference Manual的第26.1.6节,更具体地说是图26-10,解释了引导过程。 ROM代码可以使用一些输入引脚来指导引导过程 - 请参见表26-7中的SYSBOOT配置引脚。有关更多u-boot特定的AM335x相关信息,请参阅The AM335x U-Boot User's Guide

答案 1 :(得分:2)

ARM并没有制造出芯片供应商购买IP的芯片。它是芯片设计中的一个块,通常它们有许多其他块,USB控制器(可能购买ip),pcie控制器(可能购买ip),ddr,以太网,sata,emmc / sd等。加胶合逻辑,加上任何他们的秘诀是他们加入这个以使其与消费者不同而且比竞争对手更有趣。

地址空间,特别是全尺寸武器的地址空间是相当宽敞的,所以即使它们使用与其他人相同的usb ip,也不意味着它与其他人在同一地址。

没有理由假设所有具有皮质-a的芯片都以皮质-a为中心,皮质-a可能就在那里引导并管理芯片制作的真实内容。您询问的芯片最有可能以ARM处理器为中心,芯片的目的是制造一个" CPU"这是基于ARM的。我们在该市场中看到的是需要支持各种非易失性存储解决方案。有些人可能希望ram重,并且不在乎使用慢速spi flash来获取内核和根文件系统,并且运行时所有内容都基于RAM,包括文件系统。有些人可能希望支持传统的硬盘驱动器以及ram,例如文件系统是sata,旋转媒体或ssd。有些人可能希望使用eMMC,SD等。由于芯片生产成本非常高,为每种组合制作一个芯片没有意义,而是制造一个支持多种组合的芯片。你使用了几个"带"客户与地面接触或“高”的引脚(不是引脚,而是BGA上的球/焊盘)无论该电压的定义如何,当芯片复位时(无论该产品的复位引脚记录为采样带引脚),这些带引脚都会告诉处理器" (芯片作为一个实体)你希望它如何启动。我想你首先在这个spi总线上寻找一张SD卡,如果什么都没有,那么在这个界面上寻找一个sata驱动器,如果什么也没有,那么请进入uart0上的xmodem bootloader。

这导致了Frant的出色答案。芯片中有什么IP,支持哪种非易失性存储以及如果"芯片"加载引导加载程序的可能解决方案?本身支持它是非常多芯片特定的不仅仅是broadcom这样做而且它是另一个而是在他们可能的大量产品中的特定芯片或系列芯片,没有理由假设供应商的任何两个产品以相同的方式工作,你读了你感兴趣的每个人的文档。当然不要假设任何两个供应商的细节远程相同,他们很可能已经为某些技术购买了类似的ip(例如,每个人都使用相同的usb ip,或者大多数usb ip符合一组通用的寄存器,或者可能不符合......)。

我还没有接触到手臂核心,你可以在这些设计中改变主意,拉出手臂并放入一个mips并将其作为产品销售......

现在说写入逻辑来读取spi闪存,将闪存的内容加载到内部sram,然后对于那个启动模式,将该sram放在arm处理器的地址为零,然后复位arm是否有意义?是的,仅仅在逻辑上这样做并不是一个可怕的想法。但是,例如通过逻辑挖掘sata驱动器的文件系统以找到一些引导加载程序是否有意义?也许不是那么多,可能是肯定的,但也许你的产品会更长,如果你把一个rom放在产品上,可以瞄准手臂地址零臂,那个rom中的臂代码读取带子,使得决定引导介质是什么引起外围设备(sata,emmc,spi等)通过文件系统寻找文件名,将该文件复制到sram,重新映射arm地址空间(不使用mmu但是使用芯片中的逻辑)并通过分支到零来伪造复位。 (rom映射到两个地方,至少地址为零,然后是一些其他地址,以便它可以分支到另一个地址空间,允许地址零被重新映射和重用)。因此,如果你在路上发现一个错误,那么你所要做的就是在交付芯片之前改变刻录到rom中的图像,而不是旋转芯片来改变晶体管和/或晶体管的布线(便士和天/周数百万美元和几个月)。所以你实际上可能永远不会看到或者是arm处理器在重置时启动的代码。对于arm核心的重置行,您可能永远不会有任何物理或软件访问。

然后,根据这个或任何众多芯片产品的无数启动选项,下一步非常特定于该芯片和可能的启动模式。你拥有该板级产品的所有引导代码可能必须按照芯片和电路板设计,调出ddr,启动pcie,调出usb。或者也许某些芯片厂商的逻辑/代码为您做了一些(不太可能,但可能针对特定的启动情况)。现在你有了这些通用的,流行的#34引导加载程序"像u-boot一样,你作为软件设计师和实现者可能会选择在u-boot之前执行相当大量工作的代码,因为可能移植u-boot是PITA,也许不是。还要注意u-boot对linux来说绝对不需要,启动linux很容易,u-boot是一个怪物,它自己的野兽,最简单的启动linux的方法是不打扰移植u-boot。 u-boot提供的是一个已经编写的引导加载程序,它是一个参数,无论哪种方式都可以更便宜地移植u-boot,或者只是滚动自己(或将其中一个竞争对手移植到u-boot)更便宜?取决于你想要的启动选项,如果你想要bootp / tftp或任何网络堆栈,那么这就是一项任务,尽管有现成的解决方案。如果你想在某些媒体上访问文件系统,那么这只是使用u-boot的另一个有力论据。但如果你不需要所有这些,那么也许你不需要你开机。

你必须在linux启动之前查看需要发生的事情列表,芯片往往没有足够的芯片ram来保存linux内核映像和根文件系统,所以你需要在linux之前获得ddr 。你可能需要得到pcie up和枚举,也许usb我没有看过那个。但以太网可以由Linux驱动程序为该外设提供一个例子。

对" boot"的要求Linux上的linux和其他可能相对简单的linux端口。你将linux内核复制到内存中理想对齐的某个空间或者与对齐地址约定的偏移量(例如0x10001000,只是将其拉出空中),然后提供一个信息表,有多少ram, ascii内核启动字符串,以及这些天的设备树信息。你用其中一个寄存器分支到linux内核说r0指向这个表(google ATAG arm linux或者某些这样的单词组合)。多数民众赞成使用一个不老的内核启动linux在ram中设置几十个字节,将内核复制到ram,并分支到它,几十行代码,不需要u-boot怪物。现在它只是几十个字节,但它仍然是一个独立于u-boot生成的表,将其置于ram中,将内核置于ram中,设置一个或多个寄存器指向表,分支到内核所在的地址生活"启动linux"已完成或linux引导加载程序已完成。

你还需要移植linux,这是一项需要大量试验和错误以及最终多年经验的任务。特别是因为linux本身就是一个不断发展的野兽。

你如何获得u-boot代码?您可能需要编写一些pre-u-boot代码来查找u-boot并将其复制到ram然后分支到它。芯片供应商可能已经为您解决了这个问题,并且"所有您需要做的事情"将u-boot置于他们告诉您媒体选择的位置,然后将u-boot置于arm内存空间中的地址0处以用于某些内部sram,或者将u-boot置于arm内存中的某个非零地址处空间和一些魔法(芯片中基于rom的引导程序)会导致你的u-boot代码从该地址执行。

我最近搞砸的是各种beagle板上使用的ti芯片,黑色,绿色,白色,口袋等等......其中一种启动模式可以看到SD卡上的特定偏移量(不是a的一部分)文件系统,一个特定的逻辑块(如果你将在sd卡地址空间中基本上特定的偏移量)表,该表包括"处理器中的位置"您想要附加的地址空间" bootloader"要复制,压缩等等,你制作你的引导程序(自己动手或构建一个u-boot端口)你根据文档建立正确的表,目的地址有多少数据,可能是crc / checksum,等等文档说。 "芯片"神奇地(可能是软件,但可能是纯粹的逻辑)复制过来并导致手臂开始在该地址执行(可能只是在那里分支的手臂软件)。这就是你如何使用该启动选项在该产品线上运行u-boot。

SAME产品系列还有其他皮带选项,还有其他SD卡启动选项可以加载和运行u-boot。

其他供应商的其他产品有不同的解决方案。

覆盆子pi中的broadcom芯片,完全不同的野兽,或者至少它是如何使用的。它有一个broadcom(发明或购买)的gpu,gpu引导一些基于rom的代码,知道如何在SD卡上找到自己的第一阶段引导加载程序,第一阶段加载器做的事情就像初始化DDR,没有pcie这样不必发生,我不认为gpu关心USB,所以也不必枚举。但是它确实搜索了gpu代码的第二阶段引导加载程序,它实际上是一个正在加载的RTOS,这是GPU用来执行其图形功能以减轻ARM负担的代码。除此之外,该软件还在闪存上查找第三个文件(第四个和第n个),让我们再使用它复制到ram的第三个kernel.img(ddr在gpu和arm之间共享,但具有不同的寻址方案)在约定的偏移量(0x8000,如果使用kernel.img而没有对config.txt进行调整),然后gpu将引导程序和ATAG写入地址为0的ARM存储器中,然后在ARM内核上释放复位。 GPU是引导加载程序,具有相对有限的选项,但对于该平台设计/解决方案,一个媒体选项,可移动SD卡,您在手臂上运行的操作系统等是该SD卡上的任何内容。

我认为你会发现许多带子驱动多种可能的非易失性存储介质外设是更常见的解决方案。无论是针对特定SOC的这些引导选项中的一个或任何一个是否可以直接进行u-boot(或选择引导加载程序或编写自己的引导程序),或者出于任何原因都需要u-boot程序(片上sram)对于一个完整的u-boot来说太小了,比如说,参数的缘故)是针对该供应商的那个芯片的引导选项而特定的,并且在某处记录,尽管如果你不是公司的一部分让董事会签署了NDA与该芯片供应商,您可能无法看到该文档。和/或您可能知道或将要学习,这并不意味着文档是好的或有意义的。有些公司或产品做得不好,有些公司或产品做得不好,大多数公司或产品介于两者之间。如果您为零件付款并拥有NDA,您至少可以选择获得或购买技术支持,并可以提出直接问题(同样答案可能没用,取决于公司及其支持)。

仅仅因为内部存在ARM意味着什么都没有。 ARM使得处理器内核不是IP,取决于SOC设计它可能很容易或中等痛苦但可以拉出手臂并将其他购买的ip(如MIPS)放在那里或免费ip(如risc-v)并重新使用已经测试过的设计/胶水的其余部分。试图推广基于ARM的处理器就像试图用V-6发动机推广汽车一样,如果我有一辆带V-6发动机的车辆,那是否意味着前大灯控制总是在转向柱左侧的仪表板上?都能跟得上!