简单记录一下uboot的启动流程,认识不深,以后逐渐添加细节并修改。
uboot的大体启动流程:
首先板子在上电之后,CPU会从nandflash或者norflash读汇编指令,这段儿汇编代码主要功能是初始化最基本的硬件和自搬移到内存,硬件包括时钟、串口、内存等基本硬件,同时为考虑,会关闭中断、看门狗、mmu等,关掉中断,避免中断打断带来的保存返回的问题。 关掉MMU,因为u-boot软件是硬件实地址访问,根本没有用到内存地址映射。 看门狗如果没关,硬件上默认到时会复位的。 所以要关掉。
执行完这些会跳到c语言部分,之所以要分为汇编和c,因为c如果要执行需要提前准备栈,且特殊功能寄存器需要切换SVC模式,C不能做到。C语言主要是做初始化大部分硬件,搬移内核到内存同时运行内核,
U-BOOT搬移到RAM中运行的原因是:
在RAM中速度更快,但因掉电就没了,所以要保存在Nandflash或Norflash中。 如果搬移,直接在Norflash上运行也是可以的。Nandflash因是按块操作的,不太合适直接运行。
内核调试:
arm-none-linux-gnueabi-addr2line pc地址 -e vmlinux -f 可在 在源码中显示具体出错的位置