自己动手编写嵌入式BootLoader

自己动手编写嵌入式BootLoader

ID:42718580

大小:136.30 KB

页数:5页

时间:2019-09-21

自己动手编写嵌入式BootLoader_第1页
自己动手编写嵌入式BootLoader_第2页
自己动手编写嵌入式BootLoader_第3页
自己动手编写嵌入式BootLoader_第4页
自己动手编写嵌入式BootLoader_第5页
资源描述:

《自己动手编写嵌入式BootLoader》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、自己动手编写嵌入式BootLoader之(1)(转载)第一部分:基本功能流程CPU上电后会从IO空间的某地址取第一条指令。但此时:PLL没有启动,CPU工作频率为外部输入晶振频率,非常低;CPU工作模式、中断设置等不确定;存储空间的各个BANK(包括内存)都没有驱动,内存不能使用。在这种情况下必须在第一条指令处做一些初始化的工作,这段初始化程序与操作系统独立分开,称之为bootloader。实际上,很少有必要自己写一个BootLoader,因为U-Boot已经强大到能够满足各种需要。但是强大必然复杂,一个初学者想要分析U-Boot的源代码,还是有些难度的。出于学习目的,笔者写了

2、这个最简单的启动加载器,它只包含最基本的功能,却囊括了一个嵌入式BootLaoder应该有的核心和精华。把这个启动加载器命名为s-Boot(simpleBootloader)。使用的实验环境为OK2440开发板,板上处理器为S3C2440A,有64M内存,Nand存储器为K9F1208,64M。网口芯片为CS8900A。要实现的功能是:从串口下载Linux内核映像到RAM;从网口下载Linux内核映像到RAM;从RAM启动内核挂载NFS根文件系统。1.第一阶段的汇编代码:Start.S一个嵌入式BootLoader最初始部分的代码几乎必须是用汇编语言写成的,因为开发板刚上电后没

3、有准备好C程序运行环境,比如堆栈指针SP没有指到正确的位置。汇编代码应该完成最原始的硬件设备初始化,并准备好C运行环境,这样后面的功能就可以应C语言来写了。对S-Boot来说,上电后的起始运行代码是start/start.S..text.golbal_start_start:bReset@0x00:发生复位异常时从地址零处开始运行bHandleUndef@0x04:未定义指令终止模式的向量地址bHandleSWI@0x03:管理模式的向量地址,通过SWI指令进入此模式bHandlePrefetchAbort@0x0c:指令预取终止导致的异常的向量地址bHandleDataAbo

4、rt@0x10:数据访问终止导致的异常向量地址bHandleNotUsed@0x14:保留bHandleIRQ@0x18:中断模式的向量地址bHandleFRQ@0x1C:快中断模式的向量地址这里,汇编指示符.txt表明以下内容属于代码段,.global_start指明_start是全局可访问的符号(Givethesymbolexternallinkage)。按照ARM920T的规定,从地址0x00到0x1C放置一场向量表,向量表每个条目占四个字节,正好可以放置一条跳转指令,跳转到相应异常的服务程序中去。在S-Boot中没有使用中断,所以除Reset异常外,其它异常的服务程序都

5、可简单地写个死循环。Reset异常是系统上电后自动触发的,所以我们的代码都写在Reset的服务程序里面。实际上,异常向量表不一定非要位于地址0X00处,CP15协处理器的C1寄存器的第13位用来控制异常向量表的起始地址。该位为0时,异常向量表位于低地址0X00处;该位为1时,异常向量表位于高地址0xFFFF0000处。我们没有必要改变这个位的值,使用默认的低地址就行了。Reset:Mrsr0,cpsr@setcputoSVC32modeBicr0,r0,#0x1FOrrr0,r0,#0xD3Msrcpsr,r0@cpsr=11x10011,IRQ/FIQdisabled代码最初

6、始的任务是设置CPU工作在SVC32模式,关闭所有中断,禁用看门狗。实际上,即使不设置工作模式,CPU在复位之后将自动工作在管理模式。在整个S-Boot运行期间,我们没有使用中断,也没有改变CPU工作模式,它将一直工作在SVC32模式。MMU、ICache、DCache的打开和关闭都是由CP15协处理器的c1寄存器控制的。实际上在复位之后这三者都是自动关闭的,所以省略了关闭它们的代码。S3C2440A的PSR寄存器(ProgramStatusReguster)中每个Bit位的含义如图1所示。Bit4~Bit0为模式位,用来设置CPU工作模式,现在只要知道M[4:0]=10011

7、表示SVC32模式就行了。Bit5为状态位,T=0表示工作在ARM状态,T=1表示工作在Thumb状态,默认为0,不需要改变。Bit6为快速中断禁止位,F=1为禁止快速中断,F=0为使能快速中断。Bit7为中断禁止位,I=1为禁止中断,F=0为使能中断。其它Bit位暂时可以不必理会。mrs和msr是在PSR寄存器和其它寄存器间传递数据的指令。如:mrsr0,cpsr把cpsr的值传送到r0中,msrcpsr,r0把r0的值传送到cpsr中。bic是位清零(BitClear)指令,bicr0,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。