APP下载

基于S3C2440的Bootloader的分析与设计

2014-08-07符秋丽黄金龙

微型电脑应用 2014年1期
关键词:内核镜像内存

符秋丽,黄金龙

基于S3C2440的Bootloader的分析与设计

符秋丽,黄金龙

通过修改U-boot-1.1.6版本的源码,设计并实现了从NAND Flash和NOR Flash两种启动的嵌入式Bootloader,并将其移植到S3C2440微处理器的嵌入式系统上。对bootloader的设计决定了实现的bootloader不仅仅起到加载内核镜像这一基本功能,而是把bootloader看作是一个虚拟的小系统,让其对硬件板级系统有更多的支持以为系统开发者提供方便。

Bootloader; S3C2440;Uboot

0 引言

Bootloader(引导加载程序)就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境[1]。

然而,Bootloader对硬件严重依赖。它与处理器体系结构和具体嵌入式系统板级设备的配制密切相关,至今仍没有一个完全通用的Bootloader可以直接应用于各种嵌入式系统中。本文介绍了在linux操作系统下,在基于S3C2440处理器和特定的嵌入式板级设备配置下,如何成功地移植U-boot,从而实现一个较完整的Bootloader。

1 Bootloader开发环境介绍

1.1 硬件平台介绍

如表1所示:

表1 目标板硬件平台【2】

1.2 软件环境

我们采用交叉开发模式,本文采用的交叉编译器版本为:crosstools_3.4.5_softfloat,Bootloader是U-boot-1.1.6版本。

2 Bootloader的总体设计

2.1 阶段设计[3]

由于Bootloader的启动可以是分阶段的。在设计时,我们将bootloader分为两个阶段:阶段1和阶段2。分为两个阶段的原因是因为:(1)基于编程语言的考虑。阶段1用主要用汇编语言,它主要进行与CPU核以及存储设备密切相关的处理工作,进行一些必要的初始化工作,是一些依赖于CPU体系结构的代码,为了增加效率以及因为涉及到协处理器的设置,只能用汇编编写,这部分直接在FLASH中执行;阶段2用一般的C语言,来实现一般的流程以及对板级的一些驱动支持,这部分会被拷贝到RAM中执行。(2)代码具有更好的可读性与移植性:若对于相同的CPU以及存储设备,要增加外设支持,阶段1的代码可以维护不变,只对阶段2的代码进行修改;若要支持不同的CPU,则基础代码只需在阶段1中修改。

2.2 地址规划设计[4]

本文所使用的内核镜像以及根文件系统镜像都被加载到SDRAM中运行,这样做是因为基于运行速度的考虑,尽管在嵌入式系统中内核镜像与根文件系统镜像也可以直接在ROM或FLASH这样的固态存储设备中直接运行,但是为了更能清楚的解释其实现流程,在此虚拟地将其与启动阶段相对应起来,分成两个镜像:镜像1和镜像2。在本文中,将物理地址的0x00000000-0x00040000存放bootloader的镜像,内核镜像放在物理地址开始0x000c0000之后的1M空间内(内核镜像一般都小于1M大小);在前面的阶段设计中已经谈到镜像2在SDRAM中运行,这样bootloader的启动速度会大大加快,因此本文中将镜像2放在SDRAM的起始地址0xa0000000处运行;而内核镜像则规划至物理地址的0xa0300000处执行。

2.3 模式设计

本文既支持启动加载模式,也支持下载模式,具体思路为:在bootloader做完一些硬件初始化工作后,而在加载内核镜像之前,先在一定的时间内等待有没有用户有键盘输入,如果没有,则为启动加载模式,直接加载内核镜像进行启动;如果有,则进入命令行格式,这时开发者就可以根据自己的需要以及bootloader的支持情况,做一些其他的工作。模式的转换设计主要在阶段2中实现。

3 Bootloader的具体实现

3.1 阶段1的代码实现

U-boot 的stage1 一般通过start.S 来实现,它是用汇编语言写成的。由于一个可执行的Image 必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROM( Flash)的0x0 地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本文件u-boot.lds 来完成,u-boot.lds 文件用来设置U-boot 中各个目标文件的连接地址,通过ENT RY( _start ) 指定汇编程序入口点,从而进入汇编程序start.S。start.S 开始的一段代码是处理器的异常处理向量表,接下来系统复位。

3.2 阶段2的代码实现

board.c 文件中的start _armboot 函数是C 代码部分开始的函数,该函数首先通过初始函数表完成一系列系统的初始化操作,包括以下内容: CPU 的基本设置,开发板的基本初始化,初始化中断,初始化环境变量,初始化波特率,串口通讯初始化,控制台初始化第一阶段,通知代码已经运行到该处,配制可用的内存区。

完成上述初始化后,进入命令行循环,通过一个for 循环实现,for 循环中调用main.c 文件中的main_loop 函数。

4.3 移植过程及主要修改文件

在board下创建新目录存放开发板相关代码,并添加文件。

1)创建hjl2440目录,在/board目录下将smdk2410目录复制为hjl2440目录,建立自己的目标板,将smdk2410.c改名为hjl2440.c。

2) 将hjl2440目录下的Makefile中的COBJS改为:COBJS :=hjl2440.o flash.o

3)/include/configs目录下,将smdk2410.h复制为hjl2440.h。

4)修改顶层Makefile,增加:

hjl2440_config: unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t hjl2440 NULL s3c24X0

5)使用支持softfloat的交叉编译器:(crosstools_3.4.1_soft)

修改顶层(u-boot-1.1.6目录)Makefile 文件128行,修改:

ifeq ($(ARCH),arm)

CROSS_COMPILE=/opt/EmbedSky/crosstools_3.4.5_sof tfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux

endif

6)编译测试

make hjl2440_config

make

7)清除上次编译的结果:make mrproper 或者make clean

如果没有错误,则会生成u-boot.bin二进制文件,但是这时生成的u-boot.bin还不能在本开发板上运行起来,必须针对我们自己的目标板对源码做些修改。

下面介绍针对目标板对源码所做的修改:

根据S3C2440特性修改/cpu/arm920t/start.S中的中断屏蔽控制寄存器初值和对时钟的设置。将重定向代码段修改为NAND flash初始化并读取U-boot到内存。然后根据S3C2440手册修改/cpu/arm920t/start.S/s3c24x0/nand.c中NAND Flash控制寄存器的地址。

对SDRAM配置,修改lowlevel_init.S文件。lowlevel_init.S主要完成对内存的初始化,对于S3C2440只有BANK6和BANK7可以接内存,且这两个BANK必须设置为相同值。由于本开发板采用的是64MSDRAM,且2440的内存控制器和2410有一些不同之处,因此需要参考2440和内存芯片手册对其中某些常量的值做适当的修改。

对于网络相关代码,现在只需做稍微的改动,对于DM9000,需要注释掉几行代码;对于NFS,只需要添加一个延时常量。

配置文件的修改,修改include/configs/hjl2440.h,在这里放上全局的宏定义,很多参数都要在这里修改,包括CPU、系统时钟、RAM、FLASH配置信息、内存映射参数、U-boot环境变量、内核启动参数等。主要参考目标资源的硬件手册来修改。至此所有必须的修改就已完成。

4 基本功能的实现结果

当对源代码修改完毕后,进入u-boot目录下输入如图1所示:

图1 u-boot目录下输入

#make hjl2440_config #make,之后就会生成u-boot.bin文件,通过JTAG将u- boot. bin 烧入Flash 中即可,拔掉JTAG接头并复位目标板,超级终端就会打印出u-boot版本号等一系列的信息,这说明uboot就基本移植好了,u-boot是否移植成功,还要看是否能引导内核和挂载文件系统,如果终端打印出如下信息,说明移植成功。

5 总结

Bootloader是操作系统和硬件的枢纽,它为操作系统内核的启动提供了必要条件和参数。本文对bootloader的设计决定了实现的bootloader不仅仅起到加载内核镜像这一基本功能,而是把bootloader看作是一个虚拟的小系统,让其对硬件板级系统有更多的支持以为系统开发者提供方便。

[1] 孙琼.嵌入式Linux应用程序开发详解.[M]北京:人民邮电出版社,2006

[2] TQ2440底板原理图.pdf [R]广州天嵌公司 2010

[3] 王冰瑶.基于mini2440平台的U-boot移植方法. [J]计算机系统应用.2013(8):155-158

[4] 詹荣开.嵌入式系统BootLoader技术内幕[R]

Design and Transplantation of Bootloader Based on S3C2440

Fu Qiuli,Huang Jinlong
(College of Computer and Electronic Information,Guang dong University of Petrochemical Technology,Maoming 525000,China)

By modifying the U-boot-1.1.6 version of the source code, the design and implementation of NAND Flash and NOR Flash from two to start the embedded Bootloader, and ported to the embedded system on S3C2440 microprocessor.in this paper,the design of bootloader to achieve the bootloader only played the basic function to load the kernel image,but the bootloader as a virtual system, make its have more support for system developers to provide convenient for hardware board level system.

Bootloader; S3C2440; Uboot

TP368

A

1007-757X(2014)01-0049-02

2013.12.25)

符秋丽(1981-),女,河南省周口市人,广东石油化工学院,讲师,硕士,研究方向:嵌入式系统,茂名,525000黄金龙,广东石油化工学院教师,研究方向:嵌入式系统,茂名,525000

猜你喜欢

内核镜像内存
多内核操作系统综述①
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
镜像
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
Linux内核mmap保护机制研究
镜像
内存搭配DDR4、DDR3L还是DDR3?
镜像