网络消费网 >  5G > > 正文
Bootloader/u-boot的启动模式
时间:2021-12-16 10:22:05
对于计算机系统来说,从计算机开机上电的到操作系统的启动需要一个引导过程。嵌入式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、关中断,以防止意外发生;mrsr0,cpsr//读取cpsr中的数据到r0中bic r0,r0,#0x 1f//将寄存器r0的值和0x1f的反码安位与之后将结果存储在r0中相当于清零orr r0,r0,#0xd3//将寄存器r0的值和0xd3 安位或之后将结果保存在r0寄存器之中,关闭中断msrcpsr,r0//将cpsr中的数值写到r0寄存器中3、关闭看门狗,避免系统重启;#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)# if defined(CONFIG_S3C2400)#define pWTCON0x15300000#define INTMSK0x14400008#define CLKDIVN0x14800014#else#define pWTCON0x53000000#define INTMSK0x4A000008#define INTSUBMSK 0x4A00001C#define CLKDIVN0x4C000014# endif4、设置back初始化,设置cpu的工作频率;#if defined(CONFIG_S3C2440)ldrr0, =CLKDIVNmovr1,#5strr1,[r0]mrc p15,0,r1,c1,c0,0orr r1, r1,#0xc0000000mcr p15,0,r1,c1,c0,0mov r1,#CLK_CTL_BASEmov r2,#MDIV_405add r2,r2,#PSDIV_405str r2,[r1,#0x4]#elseldrr0, =CLKDIVNmovr1, #3strr1, [r0]#endifadr r0, _start//adr是读取地址的伪指令,表示将_start标示的运行地址给r0ldrr1, _TEXT_BASE// 表示将_TEXT_BASE 指向的地址中的数据拷贝到r1中cmpr0, r1//比较是否相同beqstack_setup//相同跳转出去ldrr2, _armboot_start//start起始地址,包含RO代码段+RW数据段+ZI全局变量ldrr3, _bss_start//全局变量的地址subr2, r3, r2//相减之后得到的是代码段+数据段的总大小addr2, r0 r2,//r0是要烧录的内容,表示的是烧录的代码段+数据段的结束地址copy_loop:ldmiar0!, {r3-r10}//ldmia批量的拷贝,向后拷贝32位到r3-r10(将r0中的数据读出到r3-r10的,r0自动加一)stmiar1!, {r3-r10}//stmia批量的存储到r1上也就是目标运行的地址上(将r3-r10中的数据保存到r1指向的地址上,r1自动加一)cmpr0, r2//r0 烧录的起始地址,r2烧录的结束地址,相等则说明拷贝完成ble copy_loop#endif6、设置建立堆栈;7、执行内存地址上的程序,该工作可以使ldr pc来完成;start.s是u-boot启动所执行的第一个文件,它说做的是设置系统堆栈和cpu的工作方式,为进入c程序奠定基础。第二阶段:用c语言完成,以实现更复杂的命令1、调用系统一系列的初始化函数;2、初始化Flash设备;3、初始化系统内存分配函数;4、如果目标系统有NAND设备,则初始化NAND设备;5、如果系统拥有显示设备,则初始化该类设备;6、初始化相关网络设备,填写IP、MAC地址等;7、进去命令循环(即整个boot的工作循环),接收用户从串口输入的相关命令,然后进行相应的工作;

关键词: Bootloaderu-boot启动模

版权声明:
    凡注明来网络消费网的作品,版权均属网络消费网所有,未经授权不得转载、摘编或利用其它方式使用上述作品。已经本网授权使用作品的,应在授权范围内使用,并注明"来源:网络消费网"。违反上述声明者,本网将追究其相关法律责任。
    除来源署名为网络消费网稿件外,其他所转载内容之原创性、真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考并自行核实。
热文

网站首页 |网站简介 | 关于我们 | 广告业务 | 投稿信箱
 

Copyright © 2000-2020 www.sosol.com.cn All Rights Reserved.
 

中国网络消费网 版权所有 未经书面授权 不得复制或建立镜像
 

联系邮箱:920 891 263@qq.com

备案号:京ICP备2022016840号-15

营业执照公示信息