Bootloader移植概括
发布时间:2021-11-22 09:51:56 所属栏目:教程 来源:互联网
导读:1、Bootloader移植 A、引导过程 三星的S5PC100为例 (1)、片内是有固化的程序负责第一级引导 bootloader也在外存上,首先得解决其运行的问题。片内是有固化的程序负责必要的硬件初始化工作,并把外部NANDFLASH或是NORFLASH、SD卡及其他设备上的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为例 archarmcpuarmv7start.S(有一定注释,这个是移植时候的重点,不熟悉硬件不行) 链接脚本archarmcpuarmv7u-boot.lds(这个说明那些是代码段,哪些代码先放到数据段——被其自搬移,如果第一阶段代码添加了代码,链接脚本也要改下) 第二阶段代码 archarmlibboard.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)、验证平台选择 ![]() (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |