基于MINI2440的Bootloader设计与实现.docx

上传人:b****1 文档编号:23201866 上传时间:2023-05-15 格式:DOCX 页数:27 大小:643KB
下载 相关 举报
基于MINI2440的Bootloader设计与实现.docx_第1页
第1页 / 共27页
基于MINI2440的Bootloader设计与实现.docx_第2页
第2页 / 共27页
基于MINI2440的Bootloader设计与实现.docx_第3页
第3页 / 共27页
基于MINI2440的Bootloader设计与实现.docx_第4页
第4页 / 共27页
基于MINI2440的Bootloader设计与实现.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

基于MINI2440的Bootloader设计与实现.docx

《基于MINI2440的Bootloader设计与实现.docx》由会员分享,可在线阅读,更多相关《基于MINI2440的Bootloader设计与实现.docx(27页珍藏版)》请在冰豆网上搜索。

基于MINI2440的Bootloader设计与实现.docx

基于MINI2440的Bootloader设计与实现

 

目录

摘要1

关键词1

Abstract1

Keywords1

引言1

1Bootloader的基础知识1

1.1什么是Bootloader1

1.2为什么需要Bootloader2

1.3Bootloader研究现状2

1.4Bootloader的操作模式2

1.5Bootloader概念的扩展2

1.6ARMBootloader的共性2

1.7Bootloader的通信设备和协议2

2ARM体系结构2

2.1ARM存储器3

2.2ARM工作模式3

2.3ARM寄存器3

2.4ARM体系的异常中断5

2.5ARM指令集6

3Bootloader的设计与实现6

3.1S3CMINI2440的片上资源6

3.2实验工具7

3.3设计过程7

4实验过程与结果10

4.1硬件的链接10

4.2NandFlash的分区11

4.3烧写bootloader到NanaFlash11

4.4下载内核11

4.5下载文件系统12

5测试12

6总结与展望13

致谢13

参考文献14

基于MINI2440的Bootloader设计与实现

网络工程专业学生李东海

指导教师吴俊华

摘要:

现在嵌入式系统划为Bootloader、内核、文件系统和用户应用程序四大部分,Bootloader设计是一个重要的环节。

引入Bootloader的目的是为了更好的组织片上资源、初始化硬件和方便加载内核镜像文件,以实现操作系统的启动。

本文采用汇编语言和C语言设计Bootloader,实现了禁止关门狗、存储空间分配、中断向量配置和堆栈配置等功能,能够完成硬件的初始化、应用程序的堆栈划分以及加载内核的功能,方便用户程序的增减与移植,在降低应用程序开发难度的同时提高了开发效率。

关键词:

Bootloader启动嵌入式加载内核

DesignandImplementationofBootloaderBasedonMINI2440

StudentMajoringinNetworkEngineeringLiDonghai

TutorWuJunhua

Abstract:

Theembeddedsystemisdividedintofoursections,suchasbootloader,kernel,filesystemsanduserapplicationprogram.Bootloaderdesignisanimportantpart.Thepurposeofintroducingthebootloaderistoorganizechipresourcesbetter,initializehardwareandloadkernelimagefilesconvenientlywhenbootingtheoperatingsystem.ThebootloaderisdesignedwithassemblylanguageandClanguage,whichimplementmanyfunctionssuchasprohibitionofcloseddog,distributionofstoragespace,configurationofinterruptvectorsandstackandetc.Thedesigncanimplementtheinitializationofhardware,partitionofstacksinapplicationprogramandloadkernel.Itisconvenientforusertoincrease,decreaseandtransplantprograms.Thedevelopingefficiencyisimprovedanddevelopingdifficultyisreduced.

Keywords:

Bootloader;Boot;Embedded;Loadthekernel

引言

随着IT技术的发展,各种微处理器的功能越来越强大,消费者对嵌入式产品的性能也越来越关注。

如何使嵌入式系统具有更好的任务管理、资源管理以及更好的资源分配成为嵌入式产品开发的一大问题,裸板上的应用程序已经不能满足消费者日益增长的性能要求,因此嵌入式系统逐渐分为Bootloader、内核、文件系统和用户应用程序四部分。

Bootloader就是在操作系统运行前的启动代码,作为嵌入式硬件和操作系统之间连接的桥梁,成为了嵌入式开发首要面临的问题。

1Bootloader的基础知识

1.1什么是Bootloader

Bootloader是操作系统启动前执行的程序,有点类似于PC中的BIOS,嵌入式系统通过这段程序来初始化硬件、建立内存空间映射等把系统的软硬件环境带到一个合适的环境。

当系统加电或复位时,从指定的地址读取的第一条指令就是Bootloader的指令,通过Bootloader来完成初始化工作。

Bootloader的启动过程可以是单阶段的,也可以是多阶段的。

通常多阶段的Bootloader能提供更为复杂的功能,以及更好的可移植性。

从固态存储设备上启动的Bootloader大多数是两个阶段的启动过程,即启动过程可以分为Stage1和Stage2两部分。

1.2为什么需要Bootloader

CPU刚上电时,会从指定的地址取第一条指令来执行。

但此时PLL没有启动,存储空间都还没有驱动,非常低的外部输入晶振频率作为CPU的工作频率,无法确定中断设置、堆栈指针和CPU工作模式等,因此,必须在第一条指令处完成以上的初始化工作,做好加载内核镜像的准备。

1.3Bootloader研究现状

Bootloader作为嵌入式系统运行的第一程序,如何为嵌入式产品搭建一个完善的运行环境成为各大IC企业的研究热点。

有些Bootloader的功能非常强大,它们能支持多种架构的CPU,移植性非常好。

但Bootloader的实现是严重依赖于CPU体系架构的,针对不同CPU编写的汇编部分代码不能移植到其它不同结构的CPU上。

现在嵌入式产品日新月异,即使是采用相同架构的CPU,如果采用不同的板级设备也会产生相应的Bootloader,因此构建一个完全通用的Bootloader基本上是不可能的,在资源有限的嵌入式世界里面,追求的是短小精悍中的高性能。

因此,Bootloader就像嵌入式产品一样丰富多彩,但由于这部分程序的要求非常高,一般由各大芯片厂商提供。

目前著名的Bootloader有:

U-BOOT、RedBoot、Vivi、Blob等。

1.4Bootloader的操作模式

大多数的Bootloader有启动加载和下载[1]两种工作模式,启动加载模式也称自主模式,这个启动过程没有用户的介入,Bootloader自动从目标机的某个存储设备上拷贝操作系统到RAM中,产品在发布的时候都是工作在启动加载模式,一般开发人员接触的是下载模式。

Bootloader下载到目标板之后,可以选择从串口或者网络等通信手段下载内核和文件系统等,下载过来的文件先保存在RAM中,接着再由Bootloader将其写到固态存储设备上。

下载模式一般在安装内核和根文件系统时或者系统更新时使用。

1.5Bootloader概念的扩展

Bootloader最基本的功能是初始化硬件和加载操作系统。

随着嵌入式的发展,Bootloader的功能不断的扩展,不断的增加对具体系统的板级支持,更方便开发人员进行开发和调试。

不断进行功能扩展的Bootloader已经逐渐成为一个系统级的代码包。

1.6ARMBootloader的共性

虽然Bootloader的设计和实现是根据具体的CPU和硬件设备紧密相关的,但其都是为了引导和加载内核,一般来说对ARMBootloader的操作具有以下的共性:

初始化RAM,因为程序要在RAM上运行,初始化串口,控制台与串口连接能方便的进行Debug工作和通信以及指定内核的启动,正确引导系统启动。

无论是RAM还是FLASH启动,都必须满足一定的系统状态。

首先,启动系统内核时传递参数的三个寄存器要设置为R0=0,R1=机器类型,R2=启动参数标记列表在RAM中的起始地址。

其次,CPU模式设置为SVC模式,关闭中断。

最后,必须关闭MMU和数据cache,指令Cache可以关闭也可以开启。

其中,中断的实现一般是内核机制或设备驱动管理的范畴,Bootloader没有必要实现中断,另外Bootloader只对物理地址进行操作,因此关闭MMU,镜像数据要完整的写回SDRAM中,为防止脏数据的回写,因此关闭数据Cache。

1.7Bootloader的通信设备和协议

在协议[2]的控制下,两个对等实体间的通信是本层能够向上一层提供服务。

最常见的情况就是,目标机上的Bootloader通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发。

当然,在串口上也可以采用Xmodem/Ymodem/Zmodem协议以及在以太网上采用TFTP协议[3]。

2ARM体系结构

Bootloader是根据CPU芯片和板级设备来设计的,S3CMINI2440是一款基于ARM920T的开发板。

ARM既是一个英国公司的名字,也是一类微处理器的通称,同时是一种技术的名字。

ARM体系结包含ARM处理器的存储器、数据类型、工作模式和寄存器等。

2.1ARM存储器

在ARM体系结构中,ARM920T有32位的地址线,最大可寻址空间为4GB,数据类型有字、半字和字节三种,每个字单元包含两个半字单元或四个字节单元,每个半字单元包含两个字节单元。

在字单元中,有大端格式和小端格式两种,小端格式是指字数据的高字节存放在高地址,低字节存放在低地址的格式,大端格式是指字数据的高字节存放在低地址,低字节存放在高地址的格式。

2.2ARM工作模式

ARM处理器有7种工作模式:

系统模式、用户模式、快速中断模式、普通中断模式、管理模式、数据访问中止模式、未定义指令中止模式7种工作模式。

其中除了用户模式外,其他统称为特权模式,特权模式中除系统模式外,其他统称为异常模式,如图2-1所示。

图2-1ARM处理器的7种工作模式

2.3ARM寄存器

ARM处理器7种运行模式的描述如表2-1所示。

表2-1运行模式

处理器模式

处理器模式描述

用户模式

正常程序执行时的工作模式

系统模式

用于运行特权级的系统任务

管理模式

一种保护模式,加电、复位、SWI时进入

普通中断模式

低优先级中断产生时进入,用于普通的中断处理

快速中断模式

高优先级中断产生时进入,用于高速数据传输或通道处理

数据访问中止模式

存储异常时进入该模式,用于虚拟存储和存储保护

未定义指令中止模式

执行位定义指令时进入该模式

ARM处理器有37个32位的寄存器,其中有31个通用寄存器,6个状态寄存器,这些寄存器根据不同的工作模式被分为若干个组,其中15个通用的寄存器为R1-R14和程序计数器在每种工作状态下都可见,状态寄存器有一个或两个可见,如表2-2。

表2-2ARM处理器各工作模式下的寄存器

FIQ

User/SYS

IRQ

SVC

UND

ABT

别名

R0

a1

R1

a2

R2

a3

R3

a4

R4

v1

R5

v2

R6

v3

R7

v4

R8

R8

v5

R9

R9

v6

R10

R10

sl

R11

R11

fp

R12

R12

ip

R13

R13

R13

R13

R13

R13

sp

R14

R14

R14

R14

R14

R14

lr

R15

pc

CPSR

 

SPSR

 

SPSR

SPSR

SPSR

SPSR

 

由表2-2可知:

1)R0-R7是未分组寄存器,所有工作模式下都使用同一个物理寄存器,其中R0-R3

常用作子程序调用时参数的传递[4]。

2)分组寄存器R8-R12,使用两个不同的物理寄存器,除了快速中断模式使用R8_fiq-R12_fiq外,其它的工作模式都是使用R8_usr-R12_usr。

3)分组寄存器R13-R14,使用6个不同的物理寄存器,除了系统模式和用户模式共用共有一个外,其它5种工作模式都使用自己的对应的寄存器,其中R13常用作堆栈指针SP,R14用作链接寄存器LR。

4)程序器R15又称为PC,ARM采用流水线机制,PC指向的是当前执行指令的下两条指令。

由于ARM指令是按字对齐的,所以PC值的第0位和第1位总为0。

5)另外还有两个特殊的寄存器CPSR和SPSP,一个为当前程序状态寄存器,另一个为备份程序状态寄存器,它们都包含了中断禁止位、当前处理器模式标志位和状态位等。

其中CPSR可以在任何处理器模式下被访问。

除了用户模式和系统模式外,其他工作模式都有自己的SPSR。

当特定的异常中断发生时,SPSR将得到CPSR中的内容,当异常中断返回退出时,将用SPSR中保存的值来恢复CPSR。

用户模式或者系统模式下访问SPSR,将会产生不可预知的结果。

图2-2给出PSR寄存器的相关定义,表2-3给出了特殊位的具体含义,表2-4给出了标志位的具体含义,ARM指令根据这些条件标志位来选择性地执行。

31302928272625……………………876543210

图2-2SPSR与CPSR的格式

表2-3特殊位的含义

N

负数标志

Z

结果为0标志

C

溢出标志

V

借位标志

I

为0时IRQ使能

F

为0时FIQ使能

T

0为ARM,1为THUMB

M[4:

0]0b10000

usr模式

M[4:

0]0b10001

fiq模式

M[4:

0]0b10010

irq模式

M[4:

0]0b10011

svc模式

M[4:

0]0b10111

abt模式

M[4:

0]0b11011

und模式

M[4:

0]0b11111

sys模式

表2-4标志含义

助字符后缀

标志

含义

EQ

Z置位

相等

NE

Z清零

不相等

CS

C置位

无符号数大于或等于

CC

C清零

无符号数小于

MI

N置位

负数

PL

N清零

正数或零

VS

V置位

溢出

VC

V清零

未溢出

HI

C置位Z清零

无符号数大于

LS

C清零Z置位

无符号数小于或等于

GE

N等于V

带符号数大于或等于

LT

N不等于V

带符号数小于

GT

Z清零

带符号数大于

LE

Z置位

带符号数小于或等于

AL

忽略

无条件执行

2.4ARM体系的异常中断

在ARM体系中通常用顺序执行、正常跳转和异常跳转3种方式控制程序的执行流程。

顺序执行是指程序在执行的过程中,遇到一条ARM指令,PC值加4,遇到一条THUMB指令,PC值加2,整个过程都没有发生跳转。

正常执行是指程序通过跳转指令,跳到特定标号或者子程序中执行,异常跳转是指有异常中断发生时,系统保存当前状态,跳到相应的异常处理函数去执行,当异常处理函数处理完成后返回中断发生前的下一条指令继续执行。

当正常的程序执行流程发生暂时的停止时称之为异常,例如处理一个外部的中断请求。

中断功能能够在当前指令执行结束时响应中断。

发生中断时微控制器将CPU寄存器的值压入堆栈保存,进入中断处理函数。

在中断处理函数结束时,将保存的值弹出堆栈,继续执行进入中断以前的程序[5]。

ARM处理器允许多个异常同时发生,它们将会按固定的优先级进行处理。

ARM体系所支持的异常中断类型和异常向量描述如表2-5所示。

表2-5异常中断类型和异常向量

中断向量偏移地址

异常中断类型

异常中断模式

优先级

0x00000000

复位

管理模式

1(最高)

0x00000004

未定义

未定义指令中止模式

6

0x00000008

软件中断

管理模式

6

0x0000000C

指令预取中止

数据数据中止模式

5

0x00000010

数据访问中止

数据访问中止模式

2

0x00000014

保留

保留

保留

0x00000018

普通中断请求

普通中断模式

4

0x0000001C

快速中断请求

快速中断模式

3

由表2-5可知中断向量表就是各类型中断处理程序的入口地址表[6],每种异常中断类型都在中断向量表中占四个字节的空间,这四个字节空间里存放这一条跳转指令,程序通过这个跳转指令跳到相应的异常中断处理函数处执行。

一般的中断处理过程为[7]:

1)关中断,进入不可再次响应的状态,有硬件自动实现。

2)保存断点和现场。

3)判别中断源,转向中断服务程序。

4)开中断,因为接下来就要执行中断服务程序,开中断将允许更高级中断得到响应,实现中断嵌套。

5)执行中断服务程序。

6)退出中断。

在退出时,又进入不可中断状态,即关中断,恢复现场,恢复断点,然后开中断,返回原程序执行。

ARM处理器对异常中断的响应过程和上述中断过程原理相同,如下:

1)将CPSR的内容复制到相应的SPSR中,保存处理器的当前状态、中断屏蔽位以及各条件标志位等。

2)设置CPSR中相应的位,禁止IRQ中断,当进入FIQ模式时,禁止FIQ模式,根据异常中断的类型,设置CPSR的运行模式位,使处理器进入相应的执行模式。

3)将当前指令的下一条指令的地址存入相应的LR,保证异常中断返回时能接着正确的运行。

4)将相应异常中断向量的地址放入PC,强制程序跳转到相应的异常中断处理函数处执行。

2.5ARM指令集

ARM指令集属于RISC指令系统,具有等长的指令。

ARM最大的特点之一就是使用大量的寄存器,加之指令少,能充分的利用流水线技术。

大多数ARMCORE同时支持ARM指令和Thumb指令,ARM指令每条都是32位,Thumb指令每条都是16位。

Thumb指令集的整体执行速度要优于ARM指令集,ARM指令支持多种寻址方式:

寄存器寻址、立即数寻址、寄存器间接寻址等。

ARM的指令都是条件执行的,根据条件标志位的不同编码来决定指令的执行。

条件标志位位于程序代码字节的Cond位,ARM指令的编码格式[9]如图2-3所示。

图2-3指令格式描述图

3Bootloader的设计与实现

3.1S3CMINI2440的片上资源

CPU主频400MHz,最高533Mhz+SDRAM64M32Bit数据总线,时钟频率高达100MHz+128MNandFlash+2MNorFlash+3个串行口+1个2.0mm间距10针JTAG接口+4USERLeds+12M无源晶振。

图3-1给出了ARM920T内核结构,图3-2给出了MINI2440结构。

图3-1ARM920TCORE

图3-2S3C2440结构图

3.2实验工具

硬件:

MINI2440学习开发板+交叉网线一条+USB线一条+JTAG小板一块+串口线一根。

软件:

ADS1.2+AXD+dnw+H-JTAG+超级终端。

3.3设计过程

3.3.1初始化中断控制器,关闭中断

mrsr0,cpsr      //读取CPSR中的值到R0中

bicr0,r0,#0x1F//对R0的的后五位清零

orrr0,r0,#0xD3//R0异或上0xD3

msrcpsr,r0      //将R0的值写回CPSR,禁止IRQ和FIQ

3.3.2关闭看门狗

ldrr0,=0x53000000//看门狗控制器的地址

movr1,#0x0//R1写0

strr1,[r0]//将R1的值写入R0地址处,禁止看门狗

3.3.3初始化CPU速度,刚启动时

启动时CPU工作在外接晶振12MHz频率下非常低,通过设置PLL来提高频率,使其达到FCLK=400MHz,HCLK=100MHz,PCLK=50MHz。

ldrr0,=0x4C000014//CLKDIVN寄存器的地址

movr1,#0x05//分频比例FCLK:

HCLK:

PCLK=1:

4:

8

strr1,[r0]//CLKDIVN分频FCLK:

HCLK:

PCLK=1:

4:

8

mrcp15,0,r0,c1,c0,0

orrr0,r0,#0xC0000000

mcrp15,0,r0,c1,c0,0

ldrr0,=0x4C000004//MPLLCON寄存器

ldrr1,=0x0005C011//((92<<12)|(1<<4)|

(1))

strr1,[r0]//主频FCLK设置为400MHz

3.3.4初始化内存

movr1,#0x48000000//内存控制起始地址

addrlr2,mem_cfg_val//内存大小

addr3,r1,#52

1:

ldrr4,[r2],#4//读取r2设置值,并让r2自增4

strr4,[r1],#4//将r4写入寄r1,并让r1加4  

cmpr1,r3//设置13个寄存器

bne1b//直到操作完成

3.3.5定义异常向量表

bReset//发生复位异常跳转向量地址

bHandleUndef//未定义指令中止模式跳转向量地址   

bHandleSWI  //SWI指令模式跳转向量地

bHandlePrefetchAbort//预取终止异常跳转向量地址

bHandleDataAbort    //访问终止导异常跳转向量地

bHandleNotUsed      //保留

bHandleIRQ          //中断模式跳转向量地址

bHandleFIQ          //快中断模式跳转向量地址

3.3.6设置指令集

GBLLTHUMBCODE//定义全局逻辑变量

[{CONFIG}=16//16位的Thumb指令

THUMBCODESETL{TRUE}

CODE32//32位的ARM指令

|

THUMBCODESETL{FALSE}//使用32位的ARM指令集

]

3.3.7关闭MMU、指令/数据高速缓存 

MMU、ICache、Dcache状态都由CP15协处理器的C1寄存器控制,复位的时候这三者都会自动关闭。

3.3.8设置堆栈指针

UserStackEQU(_STACK_BASEADDRESS-0x3800)//用户模式的堆栈地址

SVCStackEQU(_STACK_BASEADDRESS-0x280

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1