0. 教程完整目录
- 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理
- 01 - 下载uboot源码并使用VSCode远程查看源码、编译uboot(2012.04.01版本)
- 02 - 详细探索uboot启动过程(基于S3C2410处理器)
- 03 - 初步移植uboot 2012.04到JZ2440(修改时钟,配置串口)
- 04 - 移植uboot 2012.04到JZ2440(支持Nor Flash读写)
- 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)
- 06 - 移植uboot 2012.04到JZ2440(支持DM9000C网卡)
- 07 - 移植uboot 2012.04到JZ2440(裁剪uboot大小)
- 08 - 移植uboot 2012.04到JZ2440(设置mtd分区表)
- 09 - 移植uboot 2012.04到JZ2440(设置默认环境变量参数)
- 10 - 移植uboot 2012.04到JZ2440(烧写Linux内核、烧写yaffs2文件系统)
- 11 - 移植uboot 2012.04到JZ2440(移植完成,制作uboot补丁)
1. 嵌入式Linux系统开发架构
一个嵌入式Linux的系统的架构如下图:
软件程序开发中,从下往上每一次的作用依次为:
- Bootloader:将硬件初始化,并将内核引导起来;
- Linux Kernel:定制、裁剪之后的Linux内核;
- 根文件系统:提供文件系统,更好的使用存储空间;
- 设备驱动:完成设备操作,并向上层软件提供设备的调用接口;
- 应用程序:Linux系统编程、网络编程、shell编程、图形界面编程等等;
2. Bootloader的作用
Bootloader在上图中处于最底层,有以下两个作用:
- ①Bootloader和硬件息息相关:直接和CPU、外围硬件设备(存储器、网卡、LCD等)打交道,负责初始化硬件设备;
- ② Bootloader负责拉起内核:建立内存空间映射图,为内核的启动运行做好一切准备,最后将Linux内核代码加载到RAM中运行;
3. Bootloader的操作模式
一般来说,bootload都会提供两种操作模式:
- ① 正常启动模式:无需开发者和用户干涉,上电后自动开始运行,完成启动内核的任务;
- ② 下载模式(开发者模式):需要用户干预,进入下载模式,使用uboot命令进行操作;
4. Bootloader运行基本原理
BootLoader程序是分级载入机制,通常分为 stage1 和 stage2 两大部分。
Stage1
BootLoader 的 stage1 依赖于CPU体系结构的代码,例如CPU相关初始化代码等, 通常都用汇编语言来实现,达到高效操作的目的。
stage1 包括以下步骤:
- ①硬件设备初始化
- 屏蔽所有的中断
- 设置CPU的速度和时钟频率
- 设置内存控制器
- 关闭 CPU 内部指令/数据 cache
- ②为加载 stage2 准备 RAM 空间
- ③拷贝 stage2 到 RAM 空间中
- ④设置好堆栈指针sp,为执行 C 语言代码作好准备;
- ⑤跳转到 stage2 阶段的C程序入口处;
Stage2
BootLoader 的 stage2 通常用C语言来实现,可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。
stage2 包括以下步骤:
- ①初始化本阶段要使用到的硬件设备;
- 串口设备:以便输出信息
- ……
- ②检测系统内存映射(memory map):准备识别在整个 4GB 物理地址空间中有哪些地址范围被分配用来寻址系统的 RAM单元;
- ③将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中;
- ④为内核设置启动参数;
- ⑤调用内核:跳至内核代码入口开始执行;
5. 常用Bootloader
目前常用的Bootloader中,uboot是主流使用的,本系列文章着重讲述uboot的源码和移植。
uboot
U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot,2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot和ARMboot停止维护,但是截至目前,uboot一直在不断的更新中。
uboot的特色是“u”- universal(通用的):
- 在处理器层面:支持PowerPC系列的处理器,支持MIPS、 x86、ARM、NIOS、XScale等诸多常用系列;
- 在内核层面:除了Linux之外,还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS,LynxOS, android嵌入式操作系统等;
- 在设备驱动层面:支持串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、键盘等常用硬件设备;
这些丰富的支持依赖于uboot的源码开源,开源许可协议遵循GNU通用公共许可证。
其它
除了uboot之外,还有一些不常用的bootloader,在此作以介绍:
- Redboot:Redboot是Redhat公司随eCos发布的一个bootloader方案,也是一个开源项目;
- Blob(Boot Loader Object):由Jan-Derk Bakker and Erik Mouw发布,功能比较齐全,代码较少,比较适合做修改移植,用来引导Liunx,目前大部分S3C44B0板都用Blob修改移植后来加载uClinux;
- vivi:vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。