一、 首先下载U-BOOT的2012.4.1 ,下载方法 :打开 goole ,搜索 u- boot ,进入点击 sourcecode ,再点击 ftpserver 进行下载
将文件移到虚拟机上,解压 tar xjf u-boot-2012.04.01.tar.bz2
然后make smdk2410_config 配置一下,出现Configuring for smdk2410 board... 表示配置成功 (注意此时编译器的版本为arm-linux-gcc 4.3.2)
然后再windows 这边查看源代码,分析准备移植
二、 首先 u-boot 启动的第一个程序是在 arch/arm/cpu/arm920t/start.s 可以通过链接程序去进行分析
start.s 做的工作 :
1、set the cpu to SVC32 mode 设置为管理模式
2、关看门狗,
3、关闭中断
4、设置时钟分频系数,(注意没有设置时钟)
5 、执行 cpu_init_crit :做的工作 :打开cahe ,关闭 mmu ,运行 lowlevel_init
lowlevel_init 做的工作 :配置存储芯片 (SDRAM .nandflash norflash)的时序,位宽
6、设置堆栈 运行 board_init_f 单板初始化 链表 init_sequence (包括时钟,等待各种初始化程序), 设置各种堆栈 (malloc 、irq)的堆栈,然后最后剩下存储区的地址 重定位代码。
三、重定位代码分析
为什么需要重定位 :
开机时NAND 启动 : 将NAND FLASH中的代码,拷入片内的4K SRAM中,然后运行程序,程序从0地址开始运行
开机时NOR启动 :直接在NORFLASH中运行,NOR的起始地址为0,片内的RAM地址不为0(具体查书)。NORFLAHS只能像内存一样读数据,但不能像内存一样写入数据
当程序比较大时,就需要将程序进行重定位到一块大的内存存储上比如SDRAM
程序编译时有链接地址,这个程序在运行时的指定地址 ,注意此处的位置无关和绝对定位
重定位:需要将程序中的代码,变量,只读段都需要定位
程序还好说,当运行要去SDRAM内存执行时,直接将地址值赋给PC值就可以了,但是需要访问变量等信息,这时进行链接时使用 pie选项,就可以生成在源程序中的位置信息,重定位时,根据这些地址,生成新的重定位地址