一、start.S代码分析-涉及v210的启动机制
1、头文件有两个位置,一个是位于uboot根目录下的include文件夹,另一个是arch/arm/include,注意:之所以要在这两个文件夹找头文件,是因为在Makefile里面指定了的
譬如:
2、
_undefined_instruction:未定义指令异常。CPU在运行过程中碰到一句它无法识别的指令,可能是由于干扰或者flash介质的校验错误读上来一句它无法识别的指令,所以必须得停下来去处理这个异常;
_software_interrupt:软中断。一般用于linux操作系统的系统调用,也就是说从用户模式进入保护模式;
_prefetch_abort:预取址终止。cpu取不到下一条指令,一般发生于什么情况呢,比方说开发板只有512M内存,如果程序当中有一条指令让程序跳转到1G的地方去运行,显然会发生错误,就会产生这个异常;
_data_abort:同理,这个也是告诉CPU去一个不存在的地方取数据,那CPU也取不到数据,不得不停下来处理这个异常;
_irq:就是我们一般意义上的中断。包括定时器中断,外部触发中断,串口中断等等;
_fiq:快中断。一般用于一些实时性很高的场合
3、ldr 指令的区别
4、由3易理解ldr pc, _undefined_instruction
5、要了解v210的启动机制,需先了解它上一代产品6410的启动机制:
分四步:
1) 上电启动iROM中的程序,主要完成两件事,一初始化时钟和看门狗等外围设备,二将flash或者SD卡中的头4k的内容(图中BL1)拷贝到片内RAM中(图中Stepping Stone)
2) 这4k很小干不了什么事情,可以做些简单的配置,主要是为了配置好DDR主存(图中SDRAM),配置好后再把剩下的BootLoader大部分(图中BL2)加载到主存(图中SDRAM)
3) 然后再把程序的入口跳转到加载到主存中的BL2运行
4)BL2再把图中的OS镜像(linux或者安卓)加载到主存当中,再跳转到OS的入口运行
针对这种机制,uboot就被做成如下形式:
uboot.bin会被放在SD等介质中,上电以后,iROM会把4K的内容加载到SRAM(图中的Stepping Stone)当中,这头4K的程序会判断自己是在SRAM当中还是在SDRAM当中,如果是在SRAM当中就会去配置SDRAM,然后就会把整个bootloader(图中uboot.bin)加载到SDRAM当中,然后再跳转到已加载进SDRAM的bootloader入口开始运行,这个bootloader入口也会判断自己是在主存(SDRAM)当中还是在静态内存(SRAM)当中,如果确实是在主存当中,就会跳过这4K运行bootloader的大部分程序,包括驱动程序、命令行等等,最后再把OS加载进主存当中,把程序指针指向OS的入口处,这样就完成了整个bootloader的启动过程。
6、再看v210的启动机制就比较容易理解了
和6410的区别主要是增大了iROM和SRAM,本意是想能够将整个bootloader加载进SRAM中的,不再局限于那4K,以便从容不迫的配置SDRAM加载OS,但是uboot起码有一百多到两百多KB,SRAM太小了。所以uboot绕开了这个机制,把uboot做成了两个镜像uboot.bin、uboot-spl.bin,其中uboot-spl.bin就相当于之前的4K
二、异常向量表地址映射
根据arm手册我们知道一旦异常发生会被映射到0X00000000或者0xffff0000,这个可以通过cp15协处理器去配。ldr pc,_undefined_instruction指令被放在0XD0020014处,发生异常后会跳转到0x00000004这个地方进行处理,但是0x00000004是在iROM中的,iROM区是不可更改的,所以你不能让它跳到你自己编好的异常处理程序当中,那怎么办呢?下节讲解。