Bootloader移植简述


1、Bootloader移植
A、引导过程
三星的S5PC100为例
(1)、片内是有固化的程序负责第一级引导
bootloader也在外存上,首先得解决其运行的问题。片内是有固化的程序负责必要的硬件初始化工作,并把外部NANDFLASH或是NORFLASH、SD卡及其他设备上的bootloader的第一阶段代码运行起来。

(2)、Bootloader需要的必要功能
由于片内内存较小,所以得实现自搬移,搬移内核,并执行内核。

B、作用
(1)作必要的硬件初始化工作
CPU(SOC片子:设置时钟、屏蔽中断、关MMU等)
内存(外部内存,程序需要上内存才能运行,BOOLOADER必须能够正确读写内存)
外存(BOOLOADER的工作是搬内核上内存,所以需要能够读写外存)
(2)自搬移并搬移内核并给内核传参
bootloader在外存上,其运行由片内固化程序引导,一般片内程序能读写的外存区域不大,所以bootloader仅仅有一部分能够运行起来,这个先运行起来的代码负责搬其他代码上内存(其他代码之于自搬移代码是数据)。bootloader真正的工作代码上了内存,就接管芯片,并把外存上的内核搬到内存上并执行,并传参数给内核(bootloader 结束时要传三个值给内核,通过r0 r1 r2三个寄存器。r0:CPUid,R1机器码,r3:内核参数链表;r2必须有,r0一般u-boot是0,不用,r3也不用)。BOOLOADER传给内核的启动参数一般是写死在内存偏移0x100的位置(ARM内核代码写死的),所以BOOLOADER负责向内存偏移0x100的位置写入内核启动参数。

C、ARM主流开源bootloader
u-boot、vivi、reboot等

D、u-boot两个阶段代码
第一阶段代码:自搬移(必要的硬件初始化,完成对外存读内核代码到内存,移植难点,必须对硬件很熟悉,一般是汇编编写的)
第二阶段代码:初始化相应设备及逻辑层代码(命令、协议等,U-BOOT还支持文件系统),C代码

第一阶段代码位置
S5PC100,u-boot-2012.10为例
arch\arm\cpu\armv7\start.S(有一定注释,这个是移植时候的重点,不熟悉硬件不行)
链接脚本arch\arm\cpu\armv7\u-boot.lds(这个说明那些是代码段,哪些代码先放到数据段——被其自搬移,如果第一阶段代码添加了代码,链接脚本也要改下)

第二阶段代码
\arch\arm\lib\board.c
这个就是u-boot自己把自己搬到内存上以后的代码,C写的,C入口函数随着版本变化在变,这个版本的是board_init_f,从第一阶段代码可以看到,第一阶段把u-boot其他代码搬上内存后,就会跳转到C入口,开始执行。

E、具体移植步骤
(1)选平台(一般芯片公司已经移植了主流bootloader代码,只需要根据实际板子情况来修改相应代码,主要是外存和外部内存)
顶层目录下有个boards.cfg,向里面添加:
板子名称        体系平台    ARM核    板子名称    公司名称    SOC芯片

fsc100            arm            armv7      fsc100        samsung    s5pc1xx

上面就是在指定如下目录需要编译:


cpu/arm目录

cpu/arm/arnv7目录


cpu/arm/arnv7/s5pc1xx目录

board/samsung/fsc100目录


也可以写进顶层目录下的Makefile,示例如下:
fsc100_config:    unconfig
    @$(MKCONFIG) $(@:_config=) arm armv7 fsc100 samsung s5pc1xx

在U-BOOT顶层目录执行
#make fsc100_config
这样就是在决定应该编译那些目录,配置基本平台相关的目录。

这时候就可以编译一下了,目的如下:
(a)、检验环境(交叉编译工具链安装及相应的一些库支持,u-boot不需要第三方库支持,可能会涉及一些工具及相应编译环境的库缺失);
(b)、验证平台选择

  • 1
  • 2
  • 下一页

相关内容