启动代码与bootloader的区别

上传人:s9****2 文档编号:511621888 上传时间:2023-10-29 格式:DOCX 页数:6 大小:32.85KB
返回 下载 相关 举报
启动代码与bootloader的区别_第1页
第1页 / 共6页
启动代码与bootloader的区别_第2页
第2页 / 共6页
启动代码与bootloader的区别_第3页
第3页 / 共6页
启动代码与bootloader的区别_第4页
第4页 / 共6页
启动代码与bootloader的区别_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《启动代码与bootloader的区别》由会员分享,可在线阅读,更多相关《启动代码与bootloader的区别(6页珍藏版)》请在金锄头文库上搜索。

1、我主要遇到了这样一个问题,启动代码和Bootloader的区别以及它们在ARM上运行操作系统和不运行操作系统(只有用户程序)的关系。启动代码是Bootloader,但不能说Bootloader是启动代码。当然这也不是绝对的,只在某些情况下可以这么说。启动代码是指CPU复位后到main函数之前需要执行的汇编代码。需要这段代码是为了给C语言程序准备好堆栈空间,中断入口和外部数据等。而且这段汇编代码可以直接对硬件进行操作,效率很高。Bootloader就是在操作系统内核运行之前的一小段程序,通过这段小程序,可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为调用

2、操作系统内核、运行用户应用程序准备好正确的环境。嵌入式系统建立一个通用、标准的Bootloader是非常困难的。Bootloader也依赖于具体的嵌入式板级设备的配置,这也就是说,对于两块不同的嵌入式主板而言,即使它们是基于同一CPU而构建,要想让运行在一块板子上的Bootloader程序也能运行在另一块板子上,通常都需要修改Bootloader的源程序。启动代码内容流程:1.启动代码的第一步是设置中断和异常向量。2.完成系统启动所必须的最小配置,某些处理器芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置。3.设置看门狗,用户设计的部分外围电路如果必须在系统启动时初始化,就

3、可以放在这一步。4.配置系统所使用的存储器,包括Flash,SRAM和DRAM等,并为他们分配地址空间。如果系统使用了DRAM或其它外设,就需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息,初始化存储器系统。有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有MMU来管理内存空间。5.为处理器的每个工作模式设置栈指针,ARM处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。6.变量初始化,这里的变量指的是在软件中定义的已经赋好初值的全局变量,启动过程中需要将这部分变量从只读区域,也就是Flash拷贝到读写区域中,因为这部分变量的值在软件运行时有可能重新赋值。还

4、有一种变量不需要处理,就是已经赋好初值的静态全局变量,这部分变量在软件运行过程中不会改变,因此可以直接固化在只读的Flash或EEPROM中。7.数据区准备,对于软件中所有未赋初值的全局变量,启动过程中需要将这部分变量所在区域全部清零。8.最后一步是调用高级语言入口函数,比如main函数等。摘要:本文总结了基于S3C44B0X芯片的Bootloader代码设计的一般流程,具体说明了Bootloader完成的主要任务,实现方法和地址重映射的概念;给出了S3C44B0X在基于uCLinux操作系统的嵌入式应用中,Bootloader的引导过程及关键技术和代码,有着很好的借鉴价值。关键词: 嵌入式系

5、统Bootloader代码地址重映射S3C44B0XuCLinux 1 引言近年来,ARM在嵌入式设备中的应用越来越广泛。S3C44B0X就是Samsung公司生产的基于ARM7架构的微处理器。uCLinux是专门为无MMU处理器设计的嵌入式操作系统,支持ARM、Motorola等处理器。采用ARM+uCLinux作为嵌入式开发平台,吸取了两者优点,是一种比较流行的开发方式。在ARM程序设计中,启动代码是至关重要的,它不仅初始化硬件系统本身,而且最终引导进入操作系统,所以启动代码的设计直接影响整个开发的正常进行。本文结合S3C44B0X的特点详细给出了Bootloader设计和启动过程。2 B

6、ootLoader代码 Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要是为操作系统提供基本的运行环境,由它最终将操作系统启动起来并将控制权交给操作系统内核。Bootloader代码由汇编代码和C代码两部分组成。由于资源有限,Bootloader、uCLinux内核映象、文件系统(Ramdisk压缩映象)通常都是固化在Flash中的。在S3C44B0X架构的嵌入式系统中,为了保证上电或复位时正常运行,Bootloader必须存放在Flash(0x0-0x400000,4M)中的0x0处,则在硬件设计中把Flash接在CPU的nGCS0处1。上电后Bootloader首先

7、完成存储器、堆栈、寄存器、全局变量和基本硬件模块的初始化,这由汇编代码完成,然后将操作系统内核与文件系统调入SDRAM(0x0c000000-0x0c800000,8M)中,并将PC指针指向操作系统内核的入口处,为操作系统的运行作好准备,这由C代码完成。3 BootLoader代码设计流程 ARM芯片多数为复杂的片上系统(SOC),系统里许多硬件模块都可由软件来设置。系统的初始化直接联系到处理器内核和硬件控制器,进行编程一般用汇编语言。根据具体的目标系统,Bootloader的设计流程包括:设置异常向量表 初始化存储器系统 堆栈初始化 C例程全局变量初始化 呼叫主程序3.1 设置异常中断向量表

8、ARM处理器的中断向量表从地址0x0处开始存放,连续有84字节的空间。在ARM存储空间里每个字32位,占4个字节。可以通过图1来描述中断向量表的地址分配。每当有中断或者异常发生时,ARM处理器便强制把PC指针指向向量表中对应中断类型的地址值。为了加快中断响应,我们在Flash的0x0地址存放能跳转到0x0c000008地址处中断向量的跳转指令,即在RAM中建立一个二级中断向量表,起始地址为0x0c000008,除复位外,其它异常入口地址由Flash跳转得到,如表1所示: 图 1 中断向量表 表 1 异常向量表跳转关系3.2 初始化存储器系统存储器系统的初始化是指对Flash、RAM存储器的地址

9、范围,数据总线宽度及DRAM的刷新等进行软件设置。设置对象是存储器控制寄存器,芯片不同具体的设置不同。本文仅以开发中用到S3C44B0X为例,说明这部分程序设计的过程。memsetup:ldr r0, =MEMORY_CONFIG ldmia r0, r1-r13 ldr r0, =0x01c80000 stmia r0, r1-r13其中MEMORY_CONFIG地址处定义了配置rBWSCON, rBANKCONn(n=0-7),rREFRESH,rBANKSIZE,rMRSRB6,rMRSRB7寄存器的值(依次为0x11000100,0x700,0x700,0x7ffc,0x7568,0x

10、700,0x700,0x18008,0x18000,0xac03e1,0x16,0x020,0x020)。图 2 地址映射关系地址重映射通常把位于Flash的0x0处异常向量表映射到更快、更宽(32bit/16bit)的RAM中,并把0地址重新指向到RAM中去.图2描述了Remap前后的地址映射关系,复位时ROM定位到0x0,实际的跳转地址为ROM的Reset Handler处,Remap后0x0的ROM替换为RAM,并把中断向量表拷贝到0x0。Remap的实现和ARM处理器硬件特性相关。在S3C44B0X系统中,既没有MMU也不支持Remap,为了实现快的启动和异常处理速度,在Bootloa

11、der程序设计中,我们把RAM中的0x0c000008地址当成0x0地址处理,即在这里开始存放程序中断向量,而在Flash的0x0地址存放能跳转到0x0c000008地址处中断向量的跳转指令。支持Remap的处理器有的通过寄存器的相应Bit位置1来完成,有的通过软件设计改写Memory起始地址的Bank寄存器完成2。3.3 初始化堆栈ARM处理器有7种工作模式,每种模式都有独立的堆栈指针寄存器(SP),并定义相应地址。改变状态寄存器(CPSR)的状态位,可使处理器切换到不同模式,然后给SP赋值,就实现了堆栈的初始化。需注意的是:不要切换到用户模式进行本模式的堆栈设置,因为进入该模式后就不能修改

12、CPSR回到别的模式了,会影响程序的顺利执行3。初始化堆栈的代码如下所示:(以2个不同的SP寄存器SP_IRQ、SP_FIQ为例)InitStacks:mrsr0,cpsr ;CPSR=R0 bicr0,r0,#MODEMASK|NOINT ;屏蔽模式位和中断orrr1,r0,#IRQMODE|NOINT ;MODEMASK =0x1f, NOINT = 0x80 msrcpsr_cxsf,r1 ;转到IRQ模式 ldrsp,=IRQStack ;设置SP_irq orrr1,r0,#FIQMODE msrcpsr_cxsf,r1 ;转到FIQ模式 ldrsp,=FIQStack 3.4 C例

13、程全局变量初始化全局变量的初始化,就是完成从ROM到RAM的数据传输和内容清零。可执行程序的映像结构由RO段、RW段和ZI段三部分组成,分别为只读数据段、可写数据段和堆栈段。其中RO段在Flash和RAM里都可运行;而RW和ZI段是必须转移到RAM中去的。尽管RAM的运行速度比Flash快的多,但由于RO段比较小,拷贝到RAM也需要时间,还要程序跳转,一比较两者的启动时间差不多,最终我们选择让RO段在Flash中运行。开发工具中的链接器(Linker)提供了一定的机制来帮助我们完成这部分工作,其中|Image$ZI$Base|,|Image$ZI$Limit|,|Image$RW$Base|,|Image$RO$Limit|是由链接器定义输出的。主要是输出段的起始和终止定位信息,具体程序实现如下:startram :LDR a1,=|Image$ZI$Base| ;ZI段在RAM里面的起始地址 MOV a3,#0 ;寄存器清0 LDR a2,=|Image$ZI$Limit| ;ZI段在RAM里面的结束地址 CMP a1,a2 BEQ move_data clear_loop : STR a3,a1,#4 ;清一个字为0, a1 += 4 CMP a1,a2 BNE clear_loop

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 机械/制造/汽车 > 汽车技术

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号