将boot流程总结下:
1.cpu执行boot rom,boot rom有两层意思,
step one
- 一是指芯片内部固化程序的rom(掉电不失存储介质),该介质比我们常见的存储介质昂贵即成本高。
- 二是指固化在其中的一小段引导程序。这段程序用于初始化片内的一小片ram运存即SDRAM和初始化存储介质(nor/nand/sd),这样才可以将auxiliary code(小size)从flash或者sd卡(一般为nor flash,可靠性比较高)上copy到这片内置的SDRAM。(BootRAM)
- 此时,boot rom使命完成。Boot rom的介质比较特殊,上电后,boot rom是直接可以片上运行的,有点像nor flash,程序的存储和运行都在一个地方。
step two
2.此时pc指针指向这片内置SDRAM地址(BootRAM),
执行auxiliary code,auixiliary code初始化外置的DDR,
同时将size较大的Boot code 从flash(一般为nor flash,可靠性比较高)copy 至外置DDR中。
Copy完毕后,auxiliary code使命完成,
同时内置SDRAM可以清空作为备用DRAM来使用。
step three
3.此时pc指针从内置的SDRAM中指向外置DDR中的boot code首地址执行boot code。
Boot code一般是初始化必要的外设和引导operation system(如kernel)到DDR中,
此时uboot使命完成,pc指针指向内核,uboot占用的内存可以清掉,用作其他用途。
NOTE:3中的步骤,boot code在copy operation system 到内存中时,会去判断然后选择从什么介质(nor flash or nand flash)上去copy Operation code到内存中。
这个判断可以在auixiliary code中通过软件去配置也可以通过硬件设置(大多数情况)去设置,这个和从nor还是nand flash或者sd卡去上启动auxiliary code要区分开。 (借助OTP)
对于非高安项目我们看到每一步做的基本都是初始化ram和copy code。但是对于高安项目,每一步还会涉及到各种签名校验,可以做更多的事情。
Q&A
Q:
可以看出整个的boot flow都是为引导operation system做准备,过程中用到了一块固化rom,一块片内SDRAM,一块片外DDR。
既然是为了引导operation system,那为何不直接让boot rom去初始化外置DDR和copy operation system,却需要内置SDRAM和 auxiliary code的存在?
A:
试想一下,如果去掉图中的步骤三,power on boot rom直接去初始化外置的DDR ,然后搬移boot code。
Ok,原理上这样完全可行。
但是,如果换一颗DDR呢,比如从128换到256M呢,这两颗ddr的初始化动作是完全不同的,而此时外置ddr的初始化程序却在boot rom,而boot rom确实固化在芯片内部的,已经改不掉了。
所以我们必须找一个可以编辑修改这个初始化DDR的地方,这就是internal SDRAM和auixiliary code的作用,auixiliary code是烧在flash中,是可以修改替换的。
其实更深层的考虑是这样的:
我们需要去初始化不同的DDR,我们需要一个可以修改编辑的方式,如上面我们讲的那样
Boot rom这边内置的直接可运行rom比较昂贵,考虑到成本无法将它的size做到很大。
https://blog.csdn.net/weixin_38227420/article/details/79329471