专题4-我是bootloader设计师
一.初识Bootloader
1.航天飞机有助推器,化学反应有催化剂,跑步有助跑,先是助推器起作用,飞机再自行工作
2.把Linux内核带到他该到达的轨道,接下来让内核自主表演。简而言之就是启动内核
3.设计方法-----模仿
4.行业公认老大------U-boot
(1)支持多种嵌入式处理器arm。PowerPC。mips,x86
(2)支持多种嵌入式操作系统(Linux,Vxworks,QNX)
(3)本质就是bootloader
5.u-boot-》linux系统:两种模式
(1)整个过程没有人为干预,这种情况成为自主模式
(2)开发模式:为的是确保内核驱动正确无误,避免对内存和nandflash的重复擦写
6.建立工程
(1)不能再windows下解压uboot源码,必须在linux下解压缩
(2) 用sourceinsight建立project,注意选择每个工程有一个自己的数据库
(3)利用samba可以建立网络映射驱动器,从而在windows下通过sourceinsight直接访问linux下的文件
(4)修改sourceinsight的配置,使其可以添加汇编文件(option-->document), 再次添加文件,即可加入汇编文件
(5)同步工程,更新文件
二.ARM处理器的启动流程
1.启动方式
(1)norflash:2MB,从norflash的0地址处开始运行第一条代码,所以代码一定要放在norflash的最前端
(2)nandflash:128MB,但是nandflash没有参与同一编址,不能直接访问,需要访问特殊寄存器才可以访问,所以要从片内的4KB的boot SRAM开始执行,即0地址是排放boot sram(stepping stone),上电之后处理器自动将nandflash前4KB的内容复制到boot sram开始执行,通过bootsram来初始化相关硬件和寄存器从而访问nandflash,接下来把剩余的bootloader复制到内存(SDRAM/DRAM)中,当stepping stone 里面的4KB执行完以后跳转到内存继续执行,再接下来将内核复制到内存,从而启动操作系统。而内存要求从0x30000000开始band6开始(2440)
2.地址布局
关键词:mapping3.具体流程
关键词:booting
4.SROM也就是norflash
oneNAND既有nor的特性也有nand的特性
5.6410还支持MODEM启动
6.SD卡和nand都划归为IROM:处理器内部的固件/存储器,但不是stepping stone
7.6410地址布局
图片:Image.png
8.6410的0地址处开始是镜像区,不放置任何设备,是通过映射关系将其他设备映射到镜像区域。根据启动方式不同可以映射到不同设备。
9.6410的nandflash启动属于irom的一种,而irom里面存放的是厂商给用户写好的一些软件,如bootloader0,上电后就是取irom里面的程序来执行。通过BL0(bootloader0)将nand的前8KB拷贝到stepping stone运行,然后和2440类似。
图片:2.png
10. 210和6410类似,都支持从irom启动,nand启动是其中的一种。但是在210中stepping stone叫做IRAM,有96KB,由于垫脚石的增大,会拷贝bootloader 2 到垫脚石,而不是直接到内存。一般情况BL1最大是16KB,BL2最大尺寸是80KB。若BL2大于80KB,则要求BL1将BL2直接拷贝到内存,而不能拷贝到垫脚石。0地址也是镜像区域,通过映射关系取代码。
11.210的启动流程(BL0是厂商写好的)
图片:3.png
12.210的地址布局
图片:4.png
三.UBOOT工作流程
1.程序入口
(1)从顶层目录的Makefile入手(2)在Makefile搜索smdk2440得到
图片:6.png
其中阴影部分代表u-boot/board/samsung目录下的子目录名称
(3)进入上述子目录可以看到
图片:7.png
其中阴影部分是链接器脚本文件
(4)打开它可以看到
图片:8.png
阴影部分指明了代码段最开始部分对应的的文件是在u-boot/cpu/s3c24xx/start.o,且程序入口在_start(ENTRY(_start))。那么这个.o文件有可能是start.c编译得到的,也有可能是start.S文件编译得到的。
(5)进入u-boot/cpu/s3c24xx/,发现只有start.S文件,所以执行的第一个文件就是start.S,然后在该文件找到_start(阴影部分)
图片:9.png
2.第一阶段(BL1)
(1)目前只关心他做了什么,而不关心如何实现
(2)从start.S的_start标号处开始
图片:10.png
3.第二阶段(BL2)
(0)在清除BSSd以后有
阴影部分指明了要进入BL2阶段,即从stepp stone 跳转到内存执行
(1)通过配置和编译u-boot得到elf格式和bin格式的文件 ,然后对elf格式的进行反汇编,查找_start_armboot
#make clean
#make smdk2440_config
#make
#arm-linux-objdump -D -S u-boot >ubootdump
可以得到
黑色部分指明了该函数的入口地址,亦即_start_armboot的地址,就是BL2的入口地址,(而该地址和链接器脚本有关,但是在顶层config.mk文件中出现两个起始地址,这个时候以Ttext指定的TEXTBASE为基地址,将-T 关联的链接器脚本指定的起始地址覆盖掉。而TEXTBASE则是在板级目录的config.mk文件中定义的。)故可知道PC将要跳转到内存中执行
(2)至于为何一开始的链接地址就大于等于3000000,是因为和相对跳转有关。B只是相对跳转,而且PC指针的值和链接地址并非保持相等关系。上电就复制前4KB,与它链接的时候指定的地址无关。一开始PC必然是0,之后的跳转就看是B还是LDR,前者看两个链接地址的差值是多少,就在当前PC上加多少,后者则是直接把实际的链接地址赋给PC进行绝对跳转。
(3)第二阶段既有软件初始化,又有硬件初始化,暂时不考虑纯软件的初始化。
(4)
(5)不管哪一种平台。第二阶段都会进入到这个地方执行
4.对于6410
第一阶段的不同:
(1)外设基地址的初始化
(2)点亮LED,方便调试
(3)关闭看门狗,2440的看门狗是在系统时钟初始化的时候进行关闭的,而且在时钟初始化中屏蔽了所有中断。理论上这两项是放在时钟初始化之前的。6410则是分开执行的,并没有将这两项放在系统时钟初始化中。
5.对于210:
(1)BL1和BL2是划分开的,不像2440和6410是合并在一起的bin文件
(2)连接器脚本在spl子目录中
(3)查看脚本文件找到入口地址(start.S的_start标号处)
(4)要使L1的I/D cache 失效
(5)要检查reset状态,如果为唤醒状态,则很多工作可以省去
(6)对I/O引脚初始化(在关闭看门口之前)
(7)对sram和srom初始化(紧接(8))
(8)判断是否在内存中执行uboot,不是的话,先进行时钟初始化,再内存初始化,最后串口初始化
(9)紧接着是取消存储保护区(后面紧接nand简单初始化)
(10)接下来紧接的是disable ABB
(11)接下来是设置堆栈
(12)判断是否在内存中运行,进行不同的跳转
(13)判断启动方式,进入相应的boot函数
(14)复制代码到内存,并且PC跳转到内存中执行
(15)把BL2复制到内存中什么位置?可以查看nand_cp.C和smart210.h文件得到该config_text_base宏定义
(16)如何在nand中找到BL2?BL1虽然是16KB但是保留8KB间隔(前16KB有效),所以BL2从24KB处开始存放,故就从24KB开始对其进行复制。复制时还制订了要复制代码的大小。
(17)跳转到内存中执行BL2.在2440和 6410中用LDR,但是在210中直接去取BL2的地址,然后运行(因为是C代码,可以直接像调用函数一样调用地址):
uboot = (void *)config_text_base(字样);
(*uboot)();
(18)第一阶段到此结束
第二阶段:
(1)找到BL2的入口函数和标号,通过链接器脚本arch/arm/cpu/armv7子目录下面:u-boot.lds
(2)入口文件和标号和BL1是一样的,有重复,待修改
(3)在判断是否在内存执行的时候,跳转的位置发生了变化,会跑到arch/arm/lib子目录下的board.c文件执行board_init_f()函数(真正的BL2入口函数),就是老版本的start_armboot()函数。
(4)arch/arm/cpu/armv7子目录下面的cpu.c文件的save_boot_params()函数,他没有函数体,具有weak属性(两个同名函数的情况,遇到较强的函数,若函数自动失效,若函数使用的函数体是他的别名函数的函数体)。
框图设计

浙公网安备 33010602011771号