嵌入式linux和linux区别 嵌入式linux( 四 )


03 bootloader的分类
首先更正一个错误的说法 , 很多人说bootloader就是U-boot , 这种说法是错误的 , 确切来说是u-boot是bootloader的一种 。也就是说bootloader具有很多种类 , 
由上图可以看出 , 不同的bootloader具有不同的使用范围 , 其中最令人瞩目的就是有一个叫U-Boot的bootloader , 是一个通用的引导程序 , 而且同时支持X86、ARM和PowerPC等多种处理器架构 。U-Boot , 全称 Universal Boot Loader , 是遵循GPL条款的开放源码项目 , 是由德国DENX小组开发的用于多种嵌入式CPU的bootloader程序 , 对于Linux的开发 , 德国的u-boot做出了巨大的贡献 , 而且是开源的 。
u-boot具有以下特点:
① 开放源码;
② 支持多种嵌入式操作系统内核 , 如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多个处理器系列 , 如PowerPC、ARM、x86、MIPS、XScale;
④ 较高的可靠性和稳定性;
⑤ 高度灵活的功能设置 , 适合U-Boot调试、操作系统不同引导要求、产品发布等;
⑥ 丰富的设备驱动源码 , 如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等;
⑦ 较为丰富的开发调试文档与强大的网络技术支持;
其实 , 把u-boot可以理解为是一个小型的操作系统 。
04 u-boot的目录结构
* board 目标板相关文件 , 主要包含SDRAM、FLASH驱动;
* common 独立于处理器体系结构的通用代码 , 如内存大小探测与故障检测;
* cpu 与处理器相关的文件 。如mpc8xx子目录下含串口、网口、LCD驱动及中断初始化等文件;
* driver 通用设备驱动 , 如CFI FLASH驱动(目前对INTEL FLASH支持较好)
* doc U-Boot的说明文档;
* examples可在U-Boot下运行的示例程序;如hello_world.c,timer.c;
* include U-Boot头文件;尤其configs子目录下与目标板相关的配置头文件是移植过程中经常要修改的文件;
* lib_xxx 处理器体系相关的文件 , 如lib_ppc, lib_arm目录分别包含与PowerPC、ARM体系结构相关的文件;
* net 与网络功能相关的文件目录 , 如bootp,nfs,tftp;
【嵌入式linux和linux区别 嵌入式linux】* post 上电自检文件目录 。尚有待于进一步完善;
* rtc RTC驱动程序;
* tools 用于创建U-Boot S-RECORD和BIN镜像文件的工具;
05 u-boot的工作模式
U-Boot的工作模式有 启动加载模式和下载模式。启动加载模式是Bootloader的正常工作模式 , 嵌入式产品发布时 , Bootloader必须工作在这种模式下 , Bootloader将嵌入式操作系统从FLASH中加载到SDRAM中运行 , 整个过程是自动的 。下载模式 就是Bootloader通过某些通信手段将内核映像或根文件系统映像等从PC机中下载到目标板的SDRAM中运行 , 用户可以利用Bootloader提供的一些令接口来完成自己想要的操作 , 这种模式主要用于测试和开发 。
06 u-boot的启动过程
大多数BootLoader都分为stage1和stage2两大部分 , U-boot也不例外 。依赖于cpu体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现 , 而stage2则通常用C语言来实现 , 这样可以实现复杂的功能 , 而且有更好的可读性和移植性 。
1、 stage1(start.s代码结构)
U-boot的stage1代码通常放在start.s文件中 , 它用汇编语言写成 , 其主要代码部分如下:
(1) 定义入口 。由于一个可执行的image必须有一个入口点 , 并且只能有一个全局入口 , 通常这个入口放在rom(Flash)的0x0地址 , 因此 , 必须通知编译器以使其知道这个入口 , 该工作可通过修改连接器脚本来完成 。
(2)设置异常向量(exception vector) 。
(3)设置CPU的速度、时钟频率及中断控制寄存器 。
(4)初始化内存控制器。
(5)将rom中的程序复制到ram中 。
(6)初始化堆栈。
(7)转到ram中执行 , 该工作可使用指令ldrpc来完成 。
2、 stage2(C语言代码部分)
lib_arm/board.c中的start armboot是C语言开始的函数 , 也是整个启动代码中C语言的主函数 , 同时还是整个u-boot(armboot)的主函数 , 该函数主要完成如下操作:
(1)调用一系列的初始化函数 。

秒懂生活扩展阅读