引导顺序是什么?


35

我想知道Raspberry Pi的启动顺序在典型的设置(例如NOOBS)中是什么,从电源应用(或热复位,如果不同)到徽标的外观。或描述的地方。

除了该序列最需要的一般情况之外,我对早期阶段最感兴趣:

  1. 什么是ARM CPU的复位向量?在哪里/在哪里定义?
  2. 从什么内存中提取第一条ARM CPU指令?那在哪里,用什么技术来存储此代码?
  3. 那是ARM32还是Thumb(或者也许是Jazelle)代码?这取决于复位向量的低位吗?
  4. 早期启动代码的源(或反汇编或转储)可用吗?如果不是,是否有任何技术手段阻止使用JTAG端口来确定这一点?至于法律方面,我准备冒风险信任我对我所居住地区适用法律的理解的风险(法国),也就是说,至少在没有明确合同的情况下,我完全可以分析自己的计算机要求不要这样做。
  5. 外设以什么顺序初始化,并通过什么代码初始化?
  6. 在ARM CPU旁,BCM2835中是否运行着某些处理器/自动机,并且肯定地,其启动顺序与ARM CPU有何关系?

我准备深入研究《 ARM CPU的技术参考手册》和《BCM2835 ARM外设》或任何其他文档。

更新:张贴后,我发现这个这个,说明了BCM2835的GPU充当主到ARM,并积极参与引导顺序。


4
我只能说大部分信息都是封闭源代码,例如源代码,引导加载程序和SoC固件。。目前,分配是未知的。你应该知道一件事。BCM是GPU ...而不是CPU。引导加载程序从GPU部分开始,在那里初始化RAM,然后移交给CPU,这是我们可以访问源代码的第一个地方……又名Raspbian。祝好运。这个问题非常广泛,很难回答。
Piotr Kula 2013年

Answers:


38

Raspberry Pi的启动顺序基本上是这样的:

  1. 第1阶段引导位于片上ROM中。将阶段2加载到L2缓存中
  2. 第二阶段是bootcode.bin。启用S​​DRAM并加载阶段3
  3. 第三阶段是loader.bin。它知道.elf格式和加载start.elf
  4. start.elf负载kernel.img。那么它还读取config.txtcmdline.txt并且bcm2835.dtb 如果DTB文件存在,它是在装载0×100和内核@ 0×8000 如果disable_commandline_tags设置它加载内核@ 0×0 否则它加载内核@ 0×8000在放ATAGS0×100
  5. kernel.img 然后在ARM上运行。

一切都在GPU上运行,直到kernel.img加载到ARM上。

我发现此图非常有用:

启动顺序


2
有用。是否可以澄清第二阶段引导加载程序bootcode.bin是由GPU,ARM(然后是哪种代码)或它们的组合运行的代码?第三阶段也一样loader.bin(如果还没有消失的话)。
fgrieu

3
@fgrieu我已经编辑了答案以包括说明。一切都在GPU上运行,直到kernel.img在ARM上运行。
SG60 2013年

1
根据 loader.bin不再使用。 bootcode.binstart.elf根据此Git提交
HeatfanJohn 2014年

@ SG60:您可以使用HeatfanJohn的信息来更新您的答案吗?
Peter Mortensen

有人知道NOOBS启动吗?显然那里的过程略有不同,涉及到recover.elf和一些软启动滑稽动作。我很好奇让uboot在较低的级别上工作。
山姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.