snifer

[原创]U-Boot全解析

0
阅读(2485)

今天在网上和几个朋友讨论了U-Boot,各人有不同的看法,在此我就把这个问题的去往曾经与大家分享一下。


起源:

u-boot(Universal Boot Loader)是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序。遵循GPL条款;从FADSROM、8xxROM 、PPCBOOT逐步发展演化而来;当前版本号:见include/version.h中的定义。  

平台相关:board, cpu, lib_ppc, lib_arm, include…平台无关common, net, fs, drivers…工具和文档有tools, doc。

具体如下图所示:


U-Boot程序结构:

board

Board dependent files,

RPXlite(mpc8xx), smdk2410(arm920t), sc520_cdp(x86) …

cpu

CPU specific files,

mpc8xx, ppc4xx, arm720t, arm920t, xscale, i386

lib_ppc

Files generic to PowerPC architecture

lib_arm

Files generic to ARM architecture

lib_i386

Files generic to X86 architecture

include

Header Files and board configs

common

Misc functions

lib_generic

Generic library functions

net

Networking code

fs

File System Code

post

Power On Self Test

drivers

Common used device drivers

disk

Hard disk interface code

rtc

Real Time Clock drivers

dtt

Digital Thermometer and Thermostat drivers

U-Boot 启动过程的几个阶段 :

1、在 Flash 中运行汇编程序,将 Flash 中的启动代码部分复制到 SDRAM 中,同时创造环境准备运行 C 程序;
2、在 SDRAM 中执行,对硬件进行初始化;

3、设置内核参数的标记列表,复制镜像文件,进入内核的入口函数 。

1、初始化硬件包括:
1设置UART
2设置网口
3设置USB
4检测存储器
2设置启动参数
1内核硬件信息
2波特率
3跳转到Linux内核的首地址

4消亡 

U-Boot入口函数start.S介绍:

1设置异常的入口地址和异常处理函数;
2配置 PLLCON 寄存器,确定系统的主频;
3屏蔽看门狗和中断;初始化 I/O 寄存器;
4关闭 MMU 功能;
5调用 /board/smdk2410 中的lowlevel_init.S ,初始化存储器空间,设置刷新频率;
6将 U-Boot 的内容复制到 SDRAM 中;
7设置堆栈的大小( ldr pc, _start_armboot ) ;

8设置程序编译连接的起始地址( config.mk: TEXT_BASE = 0x33F80000 )。

这就是我对U-Boot的理解,有不对的地方大家拍砖啊!