您的位置 首页 主动

Bootloader/u-boot的发动形式

对于计算机系统来说,从计算机开机上电的到操作系统的启动需要一个引导过程。嵌入式Linux同样也需要一个引导的过程,及引导程序就叫做Bootl

关于计算机体系来说,从计算机开机上电的到操作体系的发动需求一个引导进程。嵌入式Linux相同也需求一个引导的进程,及引导程序就叫做Bootloader。Bootloader是在操作体系发动之前履行的一小段程序,经过这段小程序,咱们可以初始化硬件设备、树立内存空间映射表,然后树立恰当体系软硬件环境,为终究调用操作体系内核做好预备。

关于嵌入式体系,Bootloader是根据特定渠道来完结的,因而几乎不可能为一切的计算机操作体系树立一个通用的Bootloader,不同的处理器架构都有不同的Bootloader,Bootloader不光依靠于CPU的体系结构,而且依靠于嵌入式体系板级的设备的装备。关于两块不同的嵌入式开发板,即便他们运用同一种处理器,要想让运转于一块板子上的Bootloader运转在另一块板子上,一般都需求修正Bootloader源程序。
反过来大多数的Bootloader都具有许多的共性,某些Bootloader也可以支撑多种体系结构的嵌入式体系。例如:u-boot就一起支撑Powerpc、ARm、MIPS和X86等等的体系结构,支撑的板子有上百种,一般他们都可以主动从存储介质上发动,都可以引导操作体系发动,而且大部分都可以支撑串口和网口的操作。
体系加电或许复位后,cpu一般都会从某个地址开端履行,这是由处理器决议的,关于ARM处理器而言会从0x00000000取第一条指令,嵌入式体系的开发板都要把ROM和FLASH映射到这个地址上,因而必须将Bootloader的程序存储在相应的FLASH方位,这样体系加电后就会首要履行它。


u-boot的发动一般流程:
第一阶段:依靠cpu初始化外围硬件代码,一般用汇编代码完结
1、设置cpu的作业形式;
2、关中止,以防止意外产生;

mrs r0,cpsr//读取cpsr中的数据到r0中
bic r0,r0,#0x 1f//将寄存器r0的值和0x1f的反码安位与之后将成果存储在r0中相当于清零
orr r0,r0,#0xd3//将寄存器r0的值和0xd3 安位或之后将成果保存在r0寄存器之中,封闭中止
msr cpsr,r0//将cpsr中的数值写到r0寄存器中
3、封闭看门狗,防止体系重启;
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)

# if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008
# define CLKDIVN 0x14800014
#else
# define pWTCON 0x53000000
# define INTMSK 0x4A000008
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014
# endif
4、设置back初始化,设置cpu的作业频率;
#if defined(CONFIG_S3C2440)


ldr r0, =CLKDIVN
mov r1,#5
str r1,[r0]

mrc p15,0,r1,c1,c0,0
orr r1, r1,#0xc0000000
mcr p15,0,r1,c1,c0,0

mov r1,#CLK_CTL_BASE
mov r2,#MDIV_405
add r2,r2,#PSDIV_405
str r2,[r1,#0x4]
#else



ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
adr r0, _start //adr是读取地址的伪指令,表明将_start标明的运转地址给r0
ldr r1, _TEXT_BASE // 表明将_TEXT_BASE 指向的地址中的数据复制到r1中
cmp r0, r1 //比较是否相同
beq stack_setup //相同跳转出去


ldr r2, _armboot_start //start开始地址,包括RO代码段+RW 数据段+ZI全局变量
ldr r3, _bss_start //全局变量的地址

sub r2, r3, r2 //相减之后得到的是代码段+数据段的总巨细
add r2, r0 r2, //r0是要烧录的内容,表明的是烧录的代码段+数据段的完毕地址

copy_loop:
ldmia r0!, {r3-r10} //ldmia批量的复制,向后复制32位到r3-r10(将r0中的数据读出到r3-r10的,r0主动加一)
stmia r1!, {r3-r10} //stmia批量的存储到r1上也便是方针运转的地址上(将r3-r10中的数据保存到r1指向的地址上,r1主动加一)
cmp r0, r2 //r0 烧录的开始地址,r2烧录的完毕地址,持平则阐明复制完结
ble copy_loop
#endif
6、设置树立仓库;
7、履行内存地址上的程序,该作业可以使ldr pc来完结;


start.s是u-boot发动所履行的第一个文件,它说做的是设置体系仓库和cpu的作业方式,为进入c程序奠定根底。
第二阶段:用c言语完结,以完结更杂乱的指令
1、 调用体系一系列的初始化函数;
2、 初始化Flash设备;
3、 初始化体系内存分配函数;
4、 假如方针体系有NAND设备,则初始化NAND设备;
5、 假如体系具有显现设备,则初始化该类设备;
6、 初始化相关网络设备,填写IP、MAC地址等;
7、 进去指令循环(即整个boot的作业循环),接纳用户从串口输入的相关指令,然后进行相应的作业;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/260531.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部