《构建嵌入式linux系统bootloa》由会员分享,可在线阅读,更多相关《构建嵌入式linux系统bootloa(49页珍藏版)》请在金锄头文库上搜索。
1、嵌入式Linux移植广东省嵌入式软件公共技术中心2007年7月14日课程介绍w主要介绍l嵌入式系统结构l嵌入式软件开发lBootloader设计一 嵌入式系统结构w嵌入式系统是一个计算机系统;w嵌入式系统一般包括硬件和软件两部分n这里的硬件是以一个高性能的处理器(通常是32位处理器)为基础;n软件是以一个多任务操作系统为基础的综合平台;w这样一个软、硬件平台是单片机无法比拟的,可称之为“嵌入式系统”。(1)嵌入式硬件平台其他外设SDRAMFlash外部总线控制器SDRAM控制器时钟复位中断控制器处理器核片上系统(2)嵌入式系统软件w嵌入式软件可以分为两大类:n系统软件:控制和管理嵌入式系统资源
2、,一般是内核。n应用软件:在系统软件之上,如GUI(图形界面),网络服务器软件等。(2)嵌入式软件结构应用程序硬件平台嵌入式软件内核子程序(进程调度、内存管理、文件系统、网络、进程间通信)动态库BSP包(驱动程序)系统调用内核软件嵌入式软件开发w嵌入式应用开发过程一个嵌入式应用项目的开发过程是一个硬件和软件设计的综合过程,是一个系统设计过程,主要经历以下步骤:n硬件设计与实现n引导加载程序的设计n操作系统的移植(主要是驱动程序移植)n应用程序的设计n系统调试,样机交付w其中,引导加载程序,操作系统移植,应用程序设计是软件设计,具有自己的特点。嵌入式软件开发的特点w需要交叉编译n硬件平台处理器较
3、慢,内存和外存容量小等等;n把软件开发放在高性能的PC机上进行;nPC机上CPU指令集与嵌入式CPU的指令集是不同的,因此,在PC机上开发嵌入式软件需要交叉编译。w需要移植n由于嵌入式系统是一个软硬件定制的系统,硬件平台各不相同,软件设计需要根据不同的硬件设备来添加或修改相应的代码,这就是移植。基于linux的嵌入式软件设计在一个硬件平台上设计一个基于linux的软件系统,需要的工作可以分为以下三部分:nBootloader设计nLinux内核的定制移植,驱动程序的开发n应用程序的设计根据GEC2410开发板,构建嵌入式linux系统w接下来,我们以gec2410开发板为硬件平台,介绍构建一个
4、嵌入式linux系统的原理和过程。w系统软件有以下部分组成nBootloader为u-bootnLinux内核的版本为n应用程序由busybox、bash等构成Bootloader设计Bootloader介绍wBootloader程序是系统加电后运行的第一段代码;l通常嵌入式CPU上电或者复位时都会跳到一个特定的地址开始执行;如:ARM是0x0地址;l通常用某种类型的固态存储设备(FLASH )映射到这个预先安排的地址上;l因此在系统加电后,CPU 将首先执行的是这个特定地址上的 Boot Loader 程序。wBootloader依赖于硬件平台,因此bootloader程序一般都需要移植。
5、Bootloader程序结构wBootloader程序的结构一般分为两个阶段:lStage 1: 汇编语言编写,达到短小精悍的目的;lStage 2: C语言编写,实现更加复杂的功能;n实验:结合gec2410的bootloader程序分析bootloader程序的结构;U-boot的介绍wUboot是德国DENX软件工程小组开发的、支持多种嵌入式CPU的bootloader程序。n可引导的嵌入式操作系统:UBoot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。n支持的处理器:UBoot支
6、持PowerPC、MIPS、 x86、ARM、NIOS、XScale等诸多常用系列的处理器。n特点:功能多、灵活性强、开发积极、开放源代码、属于“monitor”U-boot的介绍wuboot的获得:n从下面地址下载uboot的源代码。n邮件列表:http:/-boot-users/U-boot的源码结构wuboot的目录结构n顶层有18个子目录,分别存放和管理不同的源代码。这些目录分三类:l与处理器体系结构或者开发板硬件直接相关l存放通用的函数或者驱动程序的目录l存放uboot的应用程序、工具、文档的目录U-boot的源码结构wuboot的目录结构nboard:存放与开发板有关的文件。每一个
7、开发板都以一个子目录出现在当前目录中。如smdk2410ncommon:实现uboot支持的命令,每一条命令都对应一个文件。例如bootm命令 - 。ncpu:与特定CPU架构相关目录,每一款Uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。ndoc:文档目录。Uboot有非常完善的文档,推荐大家参考阅读。ndrivers:Uboot支持的设备驱动程序都放在该目录,比如各种网卡、串口和USB等。U-boot的源码结构wuboot的目录结构nfs: 支持的文件系统,Uboot现在支持cramfs、fat、fdos、jffs2和registerfs。nlib_xxxx
8、: 与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。nnet:与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。ntools:生成Uboot的工具,如:mkimage, crc等等问题w问题:u-boot支持多种体系结构的CPU,那么怎么在配置编译u-boot的时候选择自己的平台呢?U-boot的配置编译wU-Boot 的源码是通过 GCC 和 Makefile 组织编译的。n首先顶层 Makefile 设置开发板的定义;n然后递归地调用各级子目录下的 Makefile;n最后把编译生成的目标文件链接成U-Boot 映像。U-boot的配
9、置编译w顶层目录下的 Makefilen负责U-Boot整体配置编译。n每一种开发板在 Makefile 都需要有板子配置的定义。n执行配置U-Boot的命令make smdk2410_config,则通过./mkconfig脚本生成include/ 的配置文件。实际上是定义了ARCH、CPU、BOARD、SOC这些变量wARCH= armwCPU= arm920twBOARD= smdk2410wSOC= s3c24x0U-boot的配置编译w顶层目录下的 MakefilenMakefile文件开始的部分包含了这些变量的定义和输出。# load ARCH, BOARD, and CPU co
10、nfigurationinclude include/exportARCH CPU BOARD VENDOR SOCU-boot的配置编译w顶层目录下的 Makefilen硬件平台依赖的目录文件就是根据这些定义来确定。SMDK2410平台相关目录如下。lboard/smdk2410/lcpu/arm920t/lcpu/arm920t/s3c24x0/llib_arm/linclude/asm-arm/U-boot的配置编译w顶层目录下的 MakefilenMakefile文件还定义uboot映象编译的依赖关系。ALL = all: $(ALL): u-boot $(OBJCOPY) $OBJC
11、FLAGS -O ihex $ $: u-boot$(OBJCOPY) $OBJCFLAGS -O srec $ $: u-boot $(OBJCOPY) $OBJCFLAGS -O binary $ $ Makefile缺省的编译目标是all,包括: U-boot的配置编译w开发板配置头文件n编译之前,可通过修改头文件include/configs/.h,为开发板定义配置选项或者参数。例如smdk2410板的头文件是。n这个头文件主要定义了两类变量l一类是选项,前缀是CONFIG_,用来选择处理器、设备接口、命令、属性等。 #define CONFIG_DRIVER_CS89001l另一类是
12、参数,前缀是 CFG_,用来定义总线频率、串口波特率、Flash 地址等参数。 #define PHYS_FLASH_10x00000000 #define CFG_FLASH_BASE PHYS_FLASH_1U-boot的配置编译wU-boot编译分2步nexport PATH=/usr/local/arm/2.95.3/bin:$PATHn第1步配置,例如:make smdk2410_config;n第2步编译,执行make,得到U-Boot各种格式的映像文件和符号表。lU-Boot映像的符号表lU-Boot映像原始的二进制格式lu-bootU-Boot 映像的 ELF 格式lU-Boo
13、t 映像是motorola的S-Record格式n其中可以按照绝对地址烧写到flash芯片中去。U-boot的移植w什么叫做移植?l当一个软件的运行环境发生变化时,软件跟硬件平台密切相关的代码需要经过修改,才能在新的平台上运行,这就是移植的工作。U-boot的移植w为什么选择U-boot作为系统的bootloader?lU-boot 源码在不断地更新,支持的开发板越来越多;lU-boot 源码被反复应用、测试和维护,具有很好的稳定性;lU-boot 较新的版本已经支持smdk2410开发板,移植的工作量少,可以缩短移植周期,提高开发效率,降低开发成本。U-boot的移植w下面就以GEC2410
14、开发板为例介绍移植的过程,硬件环境如下:lCPU: S3C2410lSDRAM: HY57V561620lNand flash: K9F1208U0B(64MB)l以太网芯片: CS8900A (10M/100MB)U-boot的移植过程(1)在顶层Makefile中为开发板添加新的配置选项,例如,参考“smdk2410_config”选项,添加如下:gec2410_config : unconfig ./mkconfig $(:_config=) arm arm920t gec2410 NULL s3c24x0w各项的意思如下: arm: CPU的架构(ARCH) arm920t: CPU的
15、类型(CPU),其对应于cpu/arm920t子目录。 gec2410: 开发板的型号(BOARD),对应于board/gec2410目录。 NULL: 开发者/或经销商(vender)。 s3c24x0: 片上系统(SOC)。U-boot的移植过程(2)在board目录中建立gec2410子目录,用于存放与开发板相关的代码,这里以smdk2410为例:#cp -rf board/smdk2410 board/gec2410 #cd board/gec2410#mvn修改board/gec2410/Makefile将:OBJS := smdk2410.o 改为:OBJS := gec2410.
16、o U-boot的移植过程(3)为gec2410开发板添加新的配置文件,存放在include/configs/中。 (4)指定交叉编译工具的路径,并配置开发板#export PATH=/usr/local/arm/2.95.3/bin:$PATH#make gec2410_config(5)编译u_boot#make执行make命令,测试编译能否成功U-boot的移植过程(6)添加驱动或者功能选项l当测试编译能够通过的时候,还要实现u_boot的以太网接口,Flash擦除、读写等的功能;l这些功能由于不同的开发板采用不同的芯片,因此需要修改源码。U-boot的移植过程w添加网络功能n修 改 文
17、 件 中 对 命 令 的 支 持 参 数CONFIG_COMMANDS,添加需要的网络命令。#define CONFIG_COMMANDS添加CFG_CMD_NETCFG_CMD_PINGn若要添加这些命令宏之外的新命令,则可参考书中的方法U-boot的移植过程w支持从nand flash启动n首先,我们来了解一下s3c2410的nand flash特性:lS3C2410的Nand Flash支持由两部分组成:wNand Flash控制器(集成在S3C2410 CPU);wNand Flash存储芯片(K9F1208U0B)两大部分组成。l对Nand Flash存储芯片进行操作, 必须通过Na
18、nd Flash控制器的专用寄存器才能完成;lNand Flash相当于一个外设,而不位于它的内存地址区;l所以,不能对Nand Flash进行总线操作。U-boot的移植过程n为了支持NAND flash起动,S3C2410内建了内部的4k的SRAM缓存“Steppingstone”。l当选择从nand flash启动的时候,Nand flash最初的4k字节将被读入“Steppingstone”然后开始执行起动代码。l通常要求起动代码在前4k代码中把他本身从Nand flash中的拷到SDRAM中以便执行主代码。U-boot的移植过程lU_boot为了支持从nand flash启动,必须在
19、启动时把自己拷贝到SDRAM中,这个搬运的工作需要我们自己实现。l具体就是在“cpu/arm920t/start.S”中添加搬运代码U-boot的移植过程w支持nand flash的读写命令l对nand flash操作的命令的实现在“common/”文件中;l移植的主要工作是在文件中添加:wnand flash专用寄存器地址的宏定义wnand flash 操作的一些命令等U-boot的移植过程(7)调试u_boot源码,直到u_boot能在开发板上正常运行起来。l调试的过程可能很艰难,这就要求我们对U_BOOT的相当熟悉;l可以用source insight建立一个u_boot的工程项目,深入
20、分析u_boot的启动代码;l在调试的过程中还可以使用一些调试技巧,比如:w当遇到串口没有打印信息的时候,我们可以借助LED灯的亮灭来提示程序执行到那里。w当遇到nand flash 芯片不能初始化的时候,可以在代码中插入一句“printf(“I am heren”)”语句,检查程序的执行。实验wu-boot的配置编译U-boot的引导w一旦u-boot被正确安装都目标板之后,接着可以使用串行线连接目标板,并且用终端程序连接目标板,然后用u-boot引导。n下面是GEC2410开发板在引导期间的输出:U-Boot 1.1.4 (Jul 16 2007 - 16:26:51)U-Boot cod
21、e: 33F80000 - 33F9C5D4 BSS: - 33FA06BCRAM Configuration:Bank #0: 30000000 64 MBFlash: 512 kBnand flash : 64 MB* Warning - bad CRC or NAND, using default environmentIn: serialOut: serialErr: serialGEC2410#U-boot的引导w正如所见,u-boot先是打印出版本信息;w然后提供与硬件有关的细节;w最后u-boot提供了一个命令提示符“GEC2410#”;w用户可以在提示符下输入相应的命令,执行相
22、应的操作。U-boot的环境变量w一旦u-boot启动和执行之后,可以通过设定适当的环境变量来设定它的配置。w查看目标板上环境变量的当前值的命令是“printenv”U-boot的环境变量例如:GEC2410#printenvbootargs=root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200bootdelay=5baudrate=115200ethaddr=12:24:56:78:9a:bcipaddrserveripnetmaskstdin=serialstdout=serialstderr=serialU-boot的环境变量w
23、各个环境变量的含义:lbootargs 传递给linux内核的命令行参数lbaudrate 串口波特率lethaddr 开发板网口物理地址lipaddr 开发板IP地址lserverip TFTP服务器地址lnetmask 开发板网关lstdin、stdout、stderr 输入、输出、错误信息输出,一般都是串口lbootcmd 定义自动启动时执行的几条命令U-boot的环境变量w设置环境变量l设置环境变量用“setenv”命令l例如:setenv ipaddrw保存环境变量l保存环境变量用“saveenv”命令l例如在设置了环境变量之后输入:saveenvl环境变量就会保存起来U-boot常
24、用命名介绍wprintenv 打印环境变量 wsetenv 设置环境变量如:setenv ipaddrsetenv serveripwsaveenv 保存设定的环境变量wtftp 即将内核镜像文件从PC中下载到SDRAM的指定地址,然后通过bootm来引导内核,前提是所用PC要安装设置tftp服务。如: tftp 30008000 zImageU-boot常用命名介绍wnand erase 擦除nand flash中数据块如:nand erase 0x40000 0x1c0000wnand write 把RAM中的数据写到Nand Flash中如:nand write 0x30008000 0x40000 0x1c0000wnand read 从nand flash中读取数据到RAMw如:nand read 0x30008000 0x40000 0x1c0000wgo 直接跳转到可执行文件的入口地址,执行可执行文件 实验w移植u-boot到2410开发板上