1、Linux系统启动与U-Boot
所谓移植就是把程序代码从一种运行环境转移到另一种运行环境。对于内核移植来说,主要是从一种硬件平台转移到另一种硬件平台上运行。
体系结构级别的移植是指在不同体系结构平台上Linux内核的移植,例如,在ARM、MIPS、PPC等不同体系结构上分别都要对每个体系结构进行特定的移植工作。一个新的体系结构出现就需要进行这个层次上的移植。
SoC级别的移植是指在具体的SoC处理器平台上Linux内核的移植,例如,ARM i.MX6Dual处理器要进行SoC特定的移植工作,主要包括处理器相关的内核修改、集成外设驱动。
主板级别的移植是指在具体的目标主板上Linux内核的移植,例如,在i.MX6DualFS2410目标板上,需要进行主板特定的移植工作,主要包括特定目标板系统启动与主板扩展外设相关的外设驱动等。
基于同一款处理器的不同嵌入式设备并不是所有的外部设备都相同,不同的开发板可以使用不同的SDRAM、Flash、以太网接口芯片等。这就需要根据硬件修改或者开发驱动程序。
一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。因此,需要移植一个Linux系统的话,那么需要以下4个步骤:
- 搭建交叉开发环境;
- BootLoader的选择和移植;
- kernel的配置、编译、和移植;
- 根文件系统的制作。
(1)BootLoader简介
引导加载程序(Boot Loader)就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
如下图所示:
为什么系统移植之前要先移植BootLoader?
BootLoader的任务是引导操作系统,所谓初始化CPU运行环境,引导操作系统。就是启动内核,让内核运行就是把内核加载到内存RAM中去运行。
是谁把CPU运行环境初始化的?
是谁把内核搬到内存中去运行?
SRAM只要系统上电就可以运行,而SDRAM需要软件进行初始化才能运行,那么内存是由谁来初始化的呢?
(2)Bootloader的执行过程
- 初始化SDRAM;
- 初始化串口;
- 检测处理器类型;
- 设置Linux启动参数;
- 调用Linux内核映像。
(3)BootLoader的分类
很多人说BootLoader就是U-Boot,这种说法是错误的,确切来说是U-Boot是BootLoader的一种。
如下图所示。
可以知道如果使用开发板board/<board_name>,就先执行“make <board_name>_config”命令进行配置,然后执行“make all”, 就可以生成如下3个文件:
- u-boot.bin:二进制可执行文件,它就是可以直接烧入eMMC中的文件。
- u-boot: ELF格式的可执行文件。
- u-boot.srec: 原摩托罗拉格式的可执行文件。
对于imx6dlsabresd开发板,可以根据开发板的型号选择执行“mak