移植u-boot学习笔记1-----实验及分析启动过程之概述

来源:互联网 发布:java spring框架 实例 编辑:程序博客网 时间:2024/06/05 22:55

1、编译

解压

tar xjf u-boot-2012.04.01.tar.bz2

切换到u-boot目录

cd u-boot-2012.04.01

配置

make smdk2410_config

编译(如果编译出现问题,考虑换编译器,安装交叉编译工具链参考http://blog.csdn.net/qingkongyeyue/article/details/52243210)

make

2、取巧办法分析u-boot启动

(1)编译u-boot,关心最后一条链接命令。从链接命令中知道u-boot组成。

arm-linux-ld是链接命令, -T u-boot.lds是指定链接脚本是u-boot.lds,-Ttext 0x0是指定代码段运行地址是0,start.o来源于start.S.


(2)查看链接脚本u-boot.lds

链接地址是0,只能在nor flash上运行。


从start.o文件开始运行


(3)分析start.S 文件

 以往启动过程回顾
a. 初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NAND FLASH
b. 如果bootloader比较大,要把它重定位到SDRAM
c. 把内核从NAND FLASH读到SDRAM
d. 设置"要传给内核的参数"
e. 跳转执行内核
start.S程序运行过程
设置为管理模式

2.1 set the cpu to SVC32 mode

关看门狗

2.2 turn off the watchdog

屏蔽所有中断

2.3 mask all IRQs by setting all bits in the INTMR

设置FCLK、HCLK和PCLK时钟的比例

2.4 设置时钟比例

跳转到cpu_init_orit函数进行CPU初始化,再跳转到底层初始化函数lowlevel_init(初始化内存,也就是设置内存控制器)

2.5 设置内存控制器

用C函数前必须先设置好栈,栈地址是往地址低处增长的

2.6 设置栈,调用C函数board_init_f

这个宏是定义一个变量gd,以前的变量存在内存里,现在可以用上面的这种格式把它定义为一个寄存器变量,读这个变量的值的时候实际上是读r8的值,我们回头看看编译程序时有,这里-ffixed-r8表示固定的r8,也就是说编译的时候它让这个编译器不使用这个r8,保留r8不变,让r8留给变量gd来用。

循环调用


2.7 调用函数数组init_sequence里的各个函数
2.7.1 board_early_init_f : 设置系统时钟、设置GPIO

......

重定位代码函数

2.8 重定位代码:
2.8.1 从NOR FLASH把代码复制到SDRAM
2.8.2 程序的链接地址是0,访问全局变量、静态变量、调用函数时是使"基于0地址编译得到的地址"
      现在把程序复制到了SDRAM
      需要修改代码,把"基于0地址编译得到的地址"改为新地址
2.8.3 程序里有些地址在链接时不能确定,要到运行前才能确定:fixabs
2.9 clear_bss
2.10 调用C函数board_init_r:第2阶段的代码

2、当某些变量无法查看到定义或赋值时用反汇编查看

(1)栈指针赋值

这里的CONFIG_SYS_SDRAM_BASE宏定义为0x30000000,GENERATED_GBL_DATA_SIZE无法在程序中找到定义,要查看反汇编文件



(2)反汇编文件

用arm-linux-objdump命令将u-boot生成反汇编文件u-boot.lds


查看反汇编文件,看栈指针取值为多少

ldr sp ,[pc,#984]是伪汇编指令,(有等号的ldr指令是伪汇编指令),如果值很复杂的话,它就会把这个值放在某个地方,用一条读内存的指令去取这个值。现在是去478的地方读值,由于可知478地址的值为0x30000f80,



3、内存分布中的gd结构体

从下面看gd结构体指向0x30000f80




内存使用图

基地址是0x30000000,栈指向0x30000f80,且结构一栈是往地址低处增长的,所以跟gd 结构体不冲突。



4、注意get_PCLK函数


由于CONFIG_S3C2440未定义,可以修改配置文件定义CONFIG_S3C2440

5、重定位代码


程序的链接地址本来就是0,也是从0启动,为什么还要重定位代码。这就是pie,看链接时加了一个选项-pie,,pie是什么意思看arm-linux-ld的帮助信息并从帮助信息里面搜索pie.链接时加上pie选项会生成所谓的位置无关可执行程序,



0 0