首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于PxA255的U-B00t启动分析及移植

基于PxA255的U-B00t启动分析及移植

关键字:PxA255   启动分析   移植   嵌入式系统  
  0 引 言

  Bootloader是操作系统运行之前执行的一小段程序,用来初始化硬件设备,建立一个系统空间映射图和一个适当的系统软硬件环境。最终Bootloader把操作系统内核映像加载到RAM中。并将系统控制权交给内核。

  U-Boot被认为是功能最多,最具弹性以及开发最积极的开放源码Bootloader。U-Boot已经能够支持PowerPC,ARM,X86和MIPS体系结构的上百种开发板,U-Boot还具有通过TFTP,从IDE或SCSI磁盘以及DOc启动的能力,还提供了JFFS2的只读功能。正是由于U-Boot较高的可靠性和稳定性;高度灵活的功能设置;丰富的设备驱动程序和丰富的开发和调试文档,因此选择U-Boot作为目标板的Boot-loader。

  对于嵌入式系统,Bootloader是基于特定的硬件来实现的,因此建立一个通用的。Bootloader是不可能的,要使Bootloader能在目标板上运行,必须做出相应的修改。

  l 目标板

  目标板采用Intel PxA255处理器,频率最高可达400 MHz,配置了32 MB的FLASH(Intel StrataFLASH)和64 MB的SDRAM(Samsung),网卡采用LAN91C96。板上有JTAG口、串口和网口,可分别完成程序的下载和调试工作。目标板的主要硬件资源如图1所示。


  2 U-Boot启动过程分析

  充分理解代码的启动流程,对于准确地判断出移植过程中出错的原因和出错的位置具有重要的作用。

  2.1 U-Boot启动的入口点

  一个可执行的Image必须有一个入口点,并且只能有一个全局入口。可执行Image的入口一般通过链接脚本文件来实现,链接脚本主要用于规定如何把文件内的section放入输出映像文件内,并控制输出文件内各个部分在程序地址空间内的分布。链接脚本文件位于board目录下的各个开发板目录。

  以U-Boot支持的开发板1ubbock为例,查看链接脚本board/lubbock/u-boot.lds,就可以知道各个部分的链接顺序。这个连接脚本决定了U-Boot的第一阶段的代码是从0xO开始的,入口由_start符号指定(ENTRY(_start)),第一个链接的文件是cup/pxa/start.o,那么U-Boot的入口指令一定位于这个程序中。

  2.2 U-Boot的启动步骤

  U—Boot的启动一般分为stagel和stage2两个部分。依赖于CPU体系结构的代码,通常用汇编语言实现,放在stagel;而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。

  根据对链接脚本文件和源代码的分析,U-Boot的启动过程中函数调用的顺序如图2所示。


  2.2.1 stagel部分

  U-Boot的stagel代码从人口函数start.S开始,它用汇编语言写成,主要完成的工作为:设置异常向量;设置CPu的速度、时钟频率及中断控制寄存器;初始化内存控制器;将ROM中的程序复制到RAM中;初始化堆栈;转到RAM中执行。

  stage1代码执行完以后,就为stage2的运行建立起了基本的硬件环境,此时的U-Boot的存储器SDRAM映射图如图3所示。


  2.2.2 stage2部分

  接下来进入到U-Boot stage2,即C语言代码部分,入口是start_arml300t,位于lib_arm/board.c中。startarmboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个U-Boot的主函数,该函数主要完成的操作为:初始化本阶段要使用到的硬件设备;检测系统内存映射;将内核映像和根文件系统映像从FLASH拷贝到SDRAM中;为内核设置启动参数;调用内核。

  在stage2部分,首先初始化全局数据表;然后顺序执行函数指针数组init_sequence中的初始化函数;接下来调用FLAsH_init()函数初始化CFI FLAsH(针对NOR FLASH);接着调用env_relocate()函数初始化环境变量;然后获取目标板的网络地址,包括IP地址和MAC地址;接着调用commend/console.c中定义的函数console_init_r()初始化串口控制台;最后进入main_loop循环,以接收用户命令。至此Bootloader的任务已经完成:初始化硬件,为内核传递参数,加载内核。

  3 U-Boot的移植

  3.1 移植的目标与主要工作

  在移植之前,需要清楚移植的目标是什么。为了达到这个目标,需要做哪些工作。一般的开发板上U-Boot所需的最小功能,包括:串口、FLASH和网卡,由此可得移植目标是:



  (1)将U-Boot移植到目标板FLASH上;

  (2)U-Boot能够在目标板上运行起来;

  (3)U-Boot能够读写目标板上FLAsH等存储设备;

  (4)U-Boot能够使网卡正常工作,能通过网卡下载数据。

  根据以上的移植目标,所做的主要工作应该包括:

  移植U-Boot与目标CPU相应的代码;移植U-Boot的FLASH驱动;移植U-Boot,的网卡驱动。
返回列表