《嵌入式系统教学课件:35arm处理器初始化分析.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统教学课件:35arm处理器初始化分析.ppt(86页珍藏版)》请在三一办公上搜索。
1、BOOTLOADER,现在计算机系统多采用“挥发性”的半导体存储器作为内存,系统加电后主存内没有内容,需要非挥发性存储存储器启动时的代码;PC系统中的启动流程:BIOS(EPROM)执行启动流程从硬盘0扇区读取采用操作系统引导程序由操作系统引导程序完成整个操作系统的加载,BOOTLOADER,嵌入式系统采用EEPROM或FLASH等介质存储操作系统映像。是内存的一部分,操作系统映像也可以在EEPROM或FLASH中就地运行。但是,实际上大多数嵌入式系统还是采用了引导/装入程序,而不让可执行映像在EEPROM或FLASH中就地执行:首先是效率方面的考虑。操作系统的多样性;有利于嵌入式系统的调试;
2、,BOOTLOADER,简单地说,Boot Loader 就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 Boot Loader 是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 Boot Loader 几乎是不可能的。尽管如此,我们仍然可以对 Boot Loader 归纳出一些通用的概念来,以指导用户特定的 Boot Loader 设计与实现。,一、什么是bootloader(引导加载程序)Bootloader,为
3、引导加载程序,是嵌入式系统加电后运行的第一段代码,相当于PC机的BIOS。 Bootloader的位置:通常固化在硬件上的某个固态存储设备上,加电后自启动。,典型的嵌入式系统组成,Bootloader在系统中的位置,BootLoader的主要功能,初始化硬件设备建立内存空间的映射图,将部分映像和操作系统装入RAM,再转入这部分映像,此后就在RAM中执行了。从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统的内核准备好正确的环境。系统加电或复位后,所有的CPU通常都从某个由CPU制造商预先安排的地址上取指令。比如,基于 XScale core 的 CPU 在复位时通常都从地址 0
4、x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(如:PROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU将首先执行Boot Loader程序。,通常的硬件初始化工作: 关闭处理器内部指令/数据cache等 关闭中断 关闭看门狗 配置PLL 配置内存 初始化各工作模式的堆栈 配置中断 拷贝RW段,初始化ZI段,Bootloader的地址:在嵌入式系统中,系统加电复位后,几乎所有的 CPU都从由复位地址上取指令。比如,基于 ARM处理器核的CPU在复位时通常都从地址 0 x00000000取它的第一
5、条指令。在这个地址处安排的就是Bootloader。,back,Bootloader是严重地依赖于硬件而实现的。每种不同体系结构的处理器都有不同的Bootloader。不过Bootloader的发展也趋于支持多种体系结构,如现在比较成熟的vivi、RedBoot和U-Boot等。,几种发布的Bootloader,表7-1开放源码的Linux引导程序,1、vivivivi是韩国Mizi公司开发的Bootloader,适用于ARM9处理器。2、RedBoot RedBoot即红帽(Red Hat)嵌入式调试引导程序,是一种用于嵌入式系统的独立开放源代码引导/装载器。3、U-Boot U-Boot(
6、Universal Bootloader)由德国DENX小组开发,是一款目前功能较为强大的开源Bootloader程序,它支持多种处理器平台,包括ARM、PowerPC、MIPS等。,back,Bootloader操作模式,大多数Bootloader都有两种不同的操作模式:“启动加载”模式和“下载”模式。其区别对于开发人员才有意义。从最终用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载模式的区别。,1、启动加载(Bootloading)模式启动加载模式称为“自举”(Autonomous)模式。即Bootloader从目标机上的某个固态存储设备上将
7、操作系统加载到 RAM 中运行,整个过程并没有用户的介入。启动加载模式是 Bootloader的正常工作模式,在嵌入式产品发布的时侯,Bootloader必须工作在这种模式下。,2、下载(Downloading)模式下载方式:在这种模式下,目标机上的Bootloader将通过串口连接或网络连接等通信手段从主机下载文件。下载内容及存储:主要是下载内核映像和根文件系统映像等。从主机下载的文件通常首先被Bootloader保存到目标机的RAM中,然后再被 Bootloader写到目标机上的FLASH 类固态存储设备中。,下载模式应用场合:Bootloader的这种模式通常在第一次安装内核与根文件系统
8、时被使用;此外,以后的系统更新也会使用到这种工作模式。用户应用接口:工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。 如在RedBoot下,将出现“RedBoot”提示符;在vivi Bootloader 下出现“vivi”提示符。,下载(Downloading)模式示例,RedBoot的Bootloader像RedBoot或U-Boot等功能强大的Bootloader通常都可同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。比如,RedBoot在启动时处于正常的启动加载模式,但是它会延时3秒等待终端用户按下任意键而将RedBoot切换到下
9、载模式。如在等待时间内没有接收到用户按键,则继续启动 Linux 内核。,back,Bootloader启动过程,Bootloader的启动可以分为两个阶段1、第一阶段阶段1主要包含依赖于CPU体系结构及硬件设备的初始化等。通常都用汇编语言来实现。这个阶段的任务有5:(1)、基本的硬件设备初始化这是 Bootloader 一开始就执行的操作,其目的是为阶段2 的执行、以及随后kernel 的执行准备好一些基本的硬件环境。,它通常包括以下工作: 关闭处理器内部指令/数据cache等 关闭中断 关闭看门狗 配置PLL 配置内存 初始化各工作模式的堆栈 配置中断 拷贝RW段,初始化ZI段,ARM7引
10、导程序示例,(2)、为阶段2代码准备RAM空间为了获得更快的执行速度,通常把 阶段2 的代码加载到 RAM 空间中来执行。 准备RAM空间考虑的因素:阶段2代码大小、堆栈、页大小(4KB的倍数)、安排位置等。 (3)、拷贝阶段2代码到RAM空间(4)、设置好堆栈堆栈指针sp设置在1MB 的 RAM 空间的最顶端(堆栈向下生长)。(5)、跳转到阶段2的C程序入口点在上述一切都就绪后,就可以跳转到 Bootloader 的 stage2 去执行了。,Bootloader的stage2可执行映像刚被拷贝到RAM空间时的系统内存布局,2、第二阶段阶段2通常用C语言来实现,以便实现更复杂的功能,也使程序
11、有更好的可读性和可移植性。这个阶段的主要任务有5:(1)、初始化本阶段要使用到的硬件至少初始化一个串口,以便和终端用户进行 I/O 输出信息等。,(2)、检测系统内存映射(memory map)所谓内存映射,就是指在整个物理地址空间中有哪些地址范围被分配用来作为系统的 RAM 单元。为后面使用RAM、运行程序做好准备。(3)、将kernel和根文件系统映像从flash读到RAM空间,(4)、为kernel设置启动参数这是在调用内核之前应该做的准备工作。Linux 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。启动参数标记列表方法:以ATAG_CORE标记
12、开始,以ATAG_NONE标记结束。在嵌入式 Linux 系统中,通常需要由 Boot Loader 设置的启动参数有:ATAG_CORE、ATAG_MEM(内存映射)、ATAG_NONE等。,(5)、调用内核Bootloader调用Linux kernel的方法是直接跳转到内核的第一条指令处。在跳转时必须满足下列条件:1)、CPU寄存器的设置:R0为0;R1为机器类型ID;R2为启动参数,标记列表在RAM中的起始基地址。 (机器类型参见 linux/arch/arm/tools/mach-types目录)2)、CPU模式: CPU必须设置为SVC模式,必须禁止中断(IRQs和FIQs)。3)
13、、 MMU 和 Cache的设置:MMU 必须关闭;指令 Cache 可以打开也可以关闭; 数据 Cache 必须关闭。,back,.2 U-Boot工程简介,最早,DENX软件工程中心的Wolfgang Denk基于8xxrom的源码创建了PPCBOOT工程,并且不断添加处理器的支持。后来,Sysgo Gmbh把PPCBOOT移植到ARM平台上,创建了ARMBOOT工程。然后以PPCBOOT工程和ARMBOOT工程为基础,创建了U-Boot工程。,现在,U-Boot已经能够支持PowerPC、ARM、X86、MIPS体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码
14、Bootloader。目前仍然由DENX的Wolfgang Denk维护。,u-boot系统启动流程,大多数bootloader都分为stage1和stage2两大部分,u-boot也不例外。依赖于CPU体系结构的代码(如设备初始化代码等)通常都放在stage1且可以用汇编语言来实现,而stage2则通常用C语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。,stage1 (start.s代码结构),u-boot的stage1代码通常放在start.s文件中,它用汇编语言写成,其主要代码部分如下:(1) 定义入口 。由于一个可执行的IMage必须有一个入口点,并且只能有一个全局入
15、口,通常这个入口放在ROM(flash)的0 x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。,(2)设置异常向量(Exception Vector)。(3)设置CPU的速度、时钟频率及中断控制寄存器。(4)初始化内存控制器 。(5)将ROM中的程序复制到RAM中。(6)初始化堆栈 。(7)转到RAM中执行,该工作可使用指令Ldr PC来完成。,2.2 stage2C语言代码部分,Lib ARM/board.c中的start armboot是C语言开始的函数,也是整个启动代码中C语言的主函数,同时还是整个u-boot(armboot)的主函数,该函数主要完成
16、如下操作:(1)调用一系列的初始化函数。(2)初始化Flash设备。,(3)初始化系统内存分配函数。(4)如果目标系统拥有NAND设备,则初始化NAND设备。(5)如果目标系统有显示设备,则初始化该类设备。(6)初始化相关网络设备,填写IP、MAC地址等。(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。,.3 U-Boot编译,解压U-Boot-1.3.1.tar.bz2就可以得到全部U-Boot源程序。在顶层目录下有18个子目录,分别存放和管理不同的源程序。 (1)与处理器体系结构或者开发板硬件直接相关。 (2)一些通用的函数或者驱动程序。 (3
17、)U-Boot的应用程序、工具或者文件。,表7-2U-Boot的源码顶层目录说明,与移植相关的主要文件夹,(1)CPU它的每个子文件夹里都有如下文件:makefileconfig.mkcpu.c 和处理器相关的代码interrupts.c 中断处理代码serial.c 串口初始化代码start.s 全局开始启动代码,与移植相关的主要文件夹,(2)BOARD它的每个子文件夹里都有如下文件:makefileconfig.mksmdk2410.c 和板子相关的代码(以smdk2410为例)flash.c flash操作代码memSetup.s 初始化SDRAM代码u-boot.lds 对应的连接文件
18、,与移植相关的主要文件夹,(3)lib_ARM体系结构下的相关实现代码,比如memcpy等的汇编语言的优化实现。,1顶层目录下的Makefile2开发板配置头文件3编译结果,支持ARM- 920T内核的代码修改,由于U-Boot-2.1.1 提供对ARM-920T 内核的直接支持,所以本步骤不需要做任何工作,本文为了让读者了解BootLoder 移植的通用模式,在此只是稍加提示。,配置自己的开发板,建立自己开发板的目录和相关文件。 1) 在include/ configs目录中以smdk2410.h为模板添加头文件S3C2410. h(cp smdk2410.h S3C2410.h) 。 这个
19、文件是开发板的配置文件,它包括开发板的CPU、系统时钟、RAM、Flash系统及其它相关的配置信息。 2) 在board/目录下创建S3C2410目录。拷贝smdk2410目录下所有文件到S3C2410目录下,共有如下六个文件:flash.c、memsetup.c、S3C2410.c、Makefile、U-Boot .lds 和config.mk,根据开发板实际情况对各个文件进行修改。,Flash.c,U-Boot读、写和删除Flash 设备的源代码文件。由于不同开发板中Flash 存储器的种类各不相同,所以,修改flash.c时需参考相应的Flash 芯片手册。它包括如下几个函数: unsi
20、gned long flash-init (void ),Flash初始化; int flash-erase (flash-info-t *info,ints-first,ints -last),Flash擦除; volatile static int write- hword (flash-info-t *info,ulong dest , ulong data) ,Flash 写入; int write-buff (flash-info-t *info,uchar *src ,ulong addr,ulong cnt),从内存复制数据。,memsetup.c,初始化时钟、SMC控制器和SD
21、RAM控制器。为了以后能用U-Boot的GO命令执行修改过的用loadb或tftp下载的U-Boot.在标记符“0:”上加入五句: mov r3,pc ldr r4,= 0 x3FFF0000 and r3,r3,r4 / /以上三句得到实际启动的内存地址 add r0,r0,r3 / /用GO 命令调试uboot时,启动地址在RAM add r2,r2,r3 / /把初始化内存信息的地址,加上实际起动地址,S3C2410.C,设置各种总线时钟,打开数据Cache和指令Cache,并设置相关内存参数。,Makefile,修改:OBJS := S3C2410.o flash.o memsetup
22、.o,U-Boot.lds.作如下修改: .text cpu/ arm920t/ start.o ( .text) * (.text) ,config.mk,用于设置程序连接的起始地址,如果想在U-Boot 中增加功能,可以留下6M 的空间,修改33F80000 为33A00000。,修改顶层Makefile,回到u-boot-2.1.1目录 rootlocalhost u-boot-2.1.1#gedit Makefilesmdk2410_config : unconfig$(MKCONFIG) $(:_config=) arm arm920t smdk2410 NULL s3c24x0在后
23、面添加自己的配置:S3C2410_config : unconfig$(MKCONFIG) $(:_config=) arm arm920t S3C2410 NULL s3c24x0,各项的意思如下,arm: CPU的架构(ARCH) arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。 S3C2410: 开发板的型号(BOARD),对应于board/S3C2410目录。 NULL: 开发者/或经销商(vender)。 s3c24x0: 片上系统(SOC)。,编译U-Boot,编译命令rootlocalhost# cd u-boot-2.1.1rootlocalho
24、st# make distcleanrootlocalhost# make s3C2410_configrootlocalhost# make编译结果u-boot in ELF formatu-boot.bin a raw binary imageu-boot.srec in MotorolaTM srec format,表7-3U-Boot编译生成的镜像文件,.4 U-Boot的移植思路,U-Boot能够支持多种体系结构的处理器,支持的开发板也越来越多。因为Bootloader是完全依赖硬件平台的,所以在新电路板上需要移植U-Boot程序。 开始移植U-Boot之前,要先熟悉硬件电路板和处理
25、器。 以S3C2410处理器的开发板为例,U-Boot的高版本已经支持SMDK2410开发板。我们可以基于SMDK2410移植,那么先把SMDK2410编译通过。移植U-Boot的基本步骤如下。,(1)在顶层Makefile中为开发板添加新的配置选项,使用已有的配置项目为例。 (2)创建一个新目录存放开发板相关的代码,并且添加新文件。 (3)为开发板添加新的配置文件。 (4)配置开发板。 (5)编译U-Boot。 (6)添加驱动或者功能选项。 (7)调试U-Boot源代码,直到U-Boot在开发板上能够正常启动。,.5 U-Boot的烧写,新开发的电路板没有任何程序可以执行,也就不能启动,需要
26、先将U-Boot烧写到Flash中。如果主板上的EPROM或者Flash能够取下来,就可以通过编程器烧写。例如,计算机BIOS就存储在一块256KB的Flash上,通过插座与主板连接。但是多数嵌入式单板使用贴片的Flash,不能取下来烧写。这种情况可以通过处理器的调试接口,直接对板上的Flash编程。,处理器调试接口是为处理器芯片设计的标准调试接口,包含BDM、JTAG和EJTAG三种接口标准。 JTAG(Joint Test Action Group,联合测试行动小组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。JTAG接口需要专用的硬件工具来连接。,开发板加
27、电(或者复位)时,烧写程序探测到处理器是否存在,并开始通信,然后把Bootloader下载并烧写到Flash中。这种方式速率很慢,平均每秒钟可以烧写100200个字节,不过价格却非常便宜。烧写完成后,复位实验板,串口终端应该显示U-Boot的启动信息。,Memory Commandsbase print or set address offset crc32 checksum calculation cmp memory compare cp memory copy md memory display mm memory modify (autoincrementing) mtest simp
28、le RAM test mw memory write (fill) nm memory modify (constant address) loop infinite loop on address range,.6 U-Boot的常用命令,U-Boot的常用命令,Flash Memory Commandscp memory copy (program flash) flinfo print FLASH memory information erase erase FLASH memory protect enable or disable FLASH write protection,U-
29、Boot的常用命令,Execution Control Commandsbootm boot application image from memory bootelf Boot from an ELF image in memory go start application at address addr,U-Boot的常用命令,Othersbootp boot image via network using bootp/tftp protocol echo ehco args to console nand legacy NAND sub-system iminfo print heade
30、r information for application imageloadb load binary file over serial line,U-Boot的常用命令,Othersloadsload S-Record file over serial linenfs boot image via network using NFS protocolprintenv print environment variablesrarpboot boot image via network using RARP/TFTP protocolrun run commands in an environ
31、ment variablesetenv set environment variablessleep delay execution for some time,1、bootm,bootm addr arg . - boot application image stored in memory passing arguments arg .; when booting a Linux kernel, arg can be the address of an initrd imagebootm命令可以引导启动存储在内存中的程序映像。这些内存包括RAM和可以永久保存的Flash。第1个参数addr
32、是程序映像的地址,这个程序映像必须转换成U-Boot的格式。第2个参数对于引导Linux内核有用,通常作为U-Boot格式的RAMDISK映像存储地址;也可以是传递给Linux内核的参数(缺省情况下传递bootargs环境变量给内核)。,2、bootp,bootp loadAddress bootfilenamebootp命令通过bootp请求,要求DHCP服务器分配IP地址,然后通过TFTP协议下载指定的文件到内存。第1个参数是下载文件存放的内存地址。第2个参数是要下载的文件名称,这个文件应该在开发主机上准备好。,3、cmp,cmp .b, .w, .l addr1 addr2 count
33、- compare memorycmp命令可以比较2块内存中的内容。.b以字节为单位;.w以字为单位;.l以长字为单位。注意:cmp.b中间不能保留空格,需要连续敲入命令。第1个参数addr1是第一块内存的起始地址。第2个参数addr2是第二块内存的起始地址。第3个参数count是要比较的数目,单位按照字节、字或者长字。,4、cp,cp .b, .w, .l source target count - copy memorycp命令可以在内存中复制数据块,包括对Flash的读写操作。第1个参数source是要复制的数据块起始地址。第2个参数target是数据块要复制到的地址。这个地址如果在Fl
34、ash中,那么会直接调用写Flash的函数操作。所以U-Boot写Flash就使用这个命令,当然需要先把对应Flash区域擦干净。第3个参数count是要复制的数目,根据cp.b cp.w cp.l分别以字节、字、长字为单位。,5、crc32,crc32 address count addr - compute CRC32 checksum save at addr crc32命令可以计算存储数据的校验和。第1个参数address是需要校验的数据起始地址。第2个参数count是要校验的数据字节数。第3个参数addr用来指定保存结果的地址。,6、echo,echo args. - echo ar
35、gs to console; c suppresses newlineecho命令回显参数。,7、erase,erase start end - erase FLASH from addr start to addr enderase N:SF-SL - erase sectors SF-SL in FLASH bank # Nerase bank N - erase FLASH bank # Nerase all - erase all FLASH banks,erase命令可以擦Flash。参数必须指定Flash擦除的范围。按照起始地址和结束地址,start必须是擦除块的起始地址;end必
36、须是擦除末尾块的结束地址。这种方式最常用。举例说明:擦除0 x20000 0 x3ffff区域命令为erase 20000 3ffff。按照组和扇区,N表示Flash的组号,SF表示擦除起始扇区号,SL表示擦除结束扇区号。另外,还可以擦除整个组,擦除组号为N的整个Flash组。擦除全部Flash只要给出一个all的参数即可。,8、flinfo,flinfo - print information for all FLASH memory banksflinfo N - print information for FLASH memory bank # Nflinfo命令打印全部Flash组的信
37、息,也可以只打印其中某个组。一般嵌入式系统的Flash只有一个组。,9、go,go addr arg . - start application at address addr passing arg as argumentsgo命令可以执行应用程序。第1个参数是要执行程序的入口地址。第2个可选参数是传递给程序的参数,可以不用。,10、minfo,iminfo addr addr . - print header information for application image starting at address addr in memory; this includes verific
38、ation of the image contents (magic number, header and payload checksums)iminfo可以打印程序映像的开头信息,包含了映像内容的校验(序列号、头和校验和)。第1个参数指定映像的起始地址。可选的参数是指定更多的映像地址。,11、loadb,loadb off baud - load binary file over serial line with offset off and baudrate baudloadb命令可以通过串口线下载二进制格式文件。,12、loads,loads off - load S-Record f
39、ile over serial line with offset offloads命令可以通过串口线下载S-Record格式文件。,13、mw,mw .b, .w, .l address value count - write memorymw命令可以按照字节、字、长字写内存,.b .w .l的用法与cp命令相同。第1个参数address是要写的内存地址。第2个参数value是要写的值。第3个可选参数count是要写单位值的数目。,14、nfs,nfs loadAddress host ip addr:bootfilenamenfs命令可以使用NFS网络协议通过网络启动映像。,15、nm,nm
40、 .b, .w, .l address - memory modify, read and keep addressnm命令可以修改内存,可以按照字节、字、长字操作。参数address是要读出并且修改的内存地址。,16、printenv,rintenv - print values of all environment variablesprintenv name . - print value of environment variable nameprintenv命令打印环境变量。可以打印全部环境变量,也可以只打印参数中列出的环境变量。,17、protect,protect on star
41、t end - protect Flash from addr start to addr endprotect on N:SF-SL - protect sectors SF-SL in Flash bank # Nprotect on bank N - protect Flash bank # Nprotect on all - protect all Flash banksprotect off start end- make Flash from addr start to addr end writable,17、protect,rotect off N:SF-SL - make s
42、ectors SF-SL writable in Flash bank # Nprotect off bank N - make Flash bank # N writableprotect off all - make all Flash banks writableprotect命令是对Flash写保护的操作,可以使能和解除写保护。第1个参数on代表使能写保护;off代表解除写保护。第2、3参数是指定Flash写保护操作范围,跟擦除的方式相同。,18、rarpboot,rarpboot loadAddress bootfilenamerarboot命令可以使用TFTP协议通过网络启动映像。
43、也就是把指定的文件下载到指定地址,然后执行。第1个参数是映像文件下载到的内存地址。第2个参数是要下载执行的映像文件。,19、run,run var . - run the commands in the environment variable(s) varrun命令可以执行环境变量中的命令,后面参数可以跟几个环境变量名。,20、setenv,setenv name value . - set environment variable name to value .setenv name - delete environment variable namesetenv命令可以设置环境变量。第1
44、个参数是环境变量的名称。第2个参数是要设置的值,如果没有第2个参数,表示删除这个环境变量。,21、sleep,sleep N - delay execution for N seconds (N is _decimal_ !)sleep命令可以延迟N秒钟执行,N为十进制数。,22、tftpboot,tftpboot loadAddress bootfilenametftpboot命令可以使用TFTP协议通过网络下载文件。按照二进制文件格式下载。另外使用这个命令,必须配置好相关的环境变量。例如serverip和ipaddr。第1个参数loadAddress是下载到的内存地址。第2个参数是要下载的文件名称,必须放在TFTP服务器相应的目录下。,