0 导言
通用Bootloader(Universal Bootloader,U-Boot)是体系上电后履行的榜首段代码,其效果首要包含初始化硬件环境以及加载履行操作体系内核。在进行体系装置时,U-Boot一般需求运用专用工具烧写到FLASH中,内核及文件体系则经过U-Boot指令进行烧写,该进程操作繁琐,而且简单犯错,不适宜体系的很多装置。
S3C6410是三星公司出产的一款根据ARM11架构的通用嵌入式处理器,其发动方法除了传统的Flash发动方式外,还支撑从SD 卡中发动体系。本文根据S3C6410处理器,剖析了从SD卡发动体系的原理,并对U-Boot源码进行修正以支撑该发动方法,在此基础上进一步扩展了U-Boot的功用,使其支撑在不需求宿主机的情况下能够一键装置体系,简化了嵌入式体系的装置布置作业。
1 U-Boot 作业原理
U-Boot的发动进程分为两阶段。榜首阶段由汇编言语完结,与详细硬件渠道相关;第二阶段由可读性和可移植性较好的C 言语完结,完结U-Boot 的首要功用。这样规划的长处在于能够把根据硬件的代码与体系的通用代码划分隔,使得体系的移植作业首要针对榜首阶段代码进行修正,而无需或只需少数修正第二阶段代码,简化了移植进程,提高了体系开发功率。
U-Boot榜首阶段代码完结的首要功用有:
(1)硬件设备的初始化;
(2)为加载bootloader 第二阶段预备RAM 空间(即初始化SDRAM);
(3)仿制bootloader 第二阶段代码到RAM 空间(U-Boot复制其悉数代码到RAM);
(4)设置仓库;
(5)跳转到第二阶段C代码入口处。
当体系完结代码转移并设置好C 言语运用的仓库等环境后,就会跳转到内存中的第二阶段代码C言语入口处持续运转。第二阶段代码完结的首要功用有:
(1)持续初始化相关硬件设备(如串口、体系时钟及定时器等);
(2)检测体系内存映射;
(3)加载内核映像及根文件体系映像;
(4)设置内核发动参数;
(5)调用内核。
第二阶段的U-Boot在设置好相应的终端设备后会中止等候若干秒,假如在该时间段内串口有输入,则U-Boot进入交互下载方式,循环读取串口指令并履行;假如串口没有输入,则U-Boot履行发动加载方式代码,将操作体系内核加载到内存并发动体系。
2 S3C6410 U-Boot SD卡发动方式剖析与移植
2.1 S3C6410 SD卡发动原理
S3C6410 支撑多种发动方法,包含NOR FLASH 发动、NAND FLASH 发动、MODEM 发动、iROM 发动等方法。其间iROM 发动方法即从internal ROM 中发动,这种方式能够供给对SD 卡的支撑。S3C6410 SD 卡发动流程如图1所示。
当挑选SD 卡发动方式时,处理器上电后,会运转iROM 中的固件程序,这个程序被称为BootLoader0(BL0),它会在进行一些必要的初始化作业后,从SD卡中指定方位读取8 KB 的U-Boot 代码到内部SteppingStone 中运转,这段代码被称为BootLoader1(BL1)。
BL1即U-Boot的前8 KB代码,这段代码会随后从SD卡中加载BL2(即整个U-Boot程序)到内存中并跳到相应地址处运转。
2.2 SD卡设备空间布局
从SD卡发动时,体系上电后BL0程序会从SD卡特定方位加载BL1代码,因而BL1代码有必要放置在预先约定好的方位上。
SD卡引导分区的空间布局如图2所示。
由图中能够看出,咱们要运用SD卡发动体系,有必要将BL1的8K代码烧写到从SD卡末端起第18个块的开始地址处,一起主张将BL2紧邻BL1放在其前面的数据块中。
2.3 添加U-Boot对SD卡发动方法支撑由以上剖析可知,体系移植的关键在于将BL2中代码从SD卡中复制到内存运转。因为U-Boot默许不支撑SD 卡发动,因而需求修正arch/arm/cpu/arm1176/start.S文件中的bnand_boot 为b mmc_boot_copy 并界说mmc_boot_copy函数为:
该段代码运用S3C6410 供给的固件函数完结了将BL2中的整个U-Boot复制到内存,并跳转到内存相应入口处持续运转的功用。
3 脱机一键装置体系功用完结
本文所移植的U-Boot版别为U-Boot-2011.06,该版别U-Boot支撑FAT文件体系文件加载指令,其指令格局为:
fatload
该指令可将运用interface接口的dev设备中的文件filename以二进制方式加载到内存地址addr处。运用该指令,能够将内核等镜像文件首先由SD 卡加载到内存中,再经过FLASH指令进行体系的烧写装置。
但上述指令的运用都是根据交互终端进行的,要想完结指令的主动运转,则需求对U-Boot源码进行剖析修正。阅览U-Boot源码可知,其第二阶段代码最终会进入common/main.c 文件中的main_loop 函数,在下载方式下,U – Boot 会循环读取用户输入的指令,并调用run_command函数履行,其函数原型为:
int run_command(const char *cmd,int flag);