Bootloader/u-boot的启动模式

发布者:陈熙琼最新更新时间:2015-11-18 来源: eefocus关键字:Bootloader  u-boot  启动模式 手机看文章 扫描二维码
随时随地手机看文章
 对于计算机系统来说,从计算机开机上电的到操作系统的启动需要一个引导过程。嵌入式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的工作循环),接收用户从串口输入的相关命令,然后进行相应的工作;
关键字:Bootloader  u-boot  启动模式 引用地址:Bootloader/u-boot的启动模式

上一篇:minis3c2440移植之内核移植
下一篇:minis3c2440移植之uboot移植

推荐阅读最新更新时间:2024-03-16 14:40

OK6410A 开发板 (三) 25 u-boot-2021.01 boot 解析 U-boot 内存命令 md
md.b $address $count (从地址$address处显示$count个字节的数据 b=byte,字节,8位) md.w $address $count (从地址$address处显示$count个字的数据 w=word,字 ,16位) md.l $address $count (从地址$address处显示$count个双字的数据 l=long,双字,32位) 内存里的数据 = tftp 51000000 2led_c.bin dm9000 i/o: 0x18000300, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 76:c5:cb:38
[单片机]
STM32F103ZET6 启动模式
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家
[单片机]
U-boot在S3C2440上的移植详解(四)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 在这一篇中,我们首先让开发板对CS8900或者DM9000X网卡的支持,然后再分析实现u-boot怎样来引导Linux内核启动。因为测试u-boot引导内核我们要用到网络下载功能。 7)u-boot对CS8900或者DM9000X网卡的支持。 u-boot-2009.08版本已经对CS8900和DM9000X网卡有比较完善的代码支持(代码在drivers/ne
[单片机]
<font color='red'>U-boot</font>在S3C2440上的移植详解(四)
U-Boot移植(1)新建一个开发板的相应目录和文件
今天很高兴,终于把U-Boot移植成功,在做的同时,我把一些步骤以截图记下。。现在我来慢慢回顾下过程。。 1、从官网上下了个U-Boot-1.1.6,网址:http://sourceforge.net/projects/u-boot/。然后放到Ubuntu的/work/下,解压。 2、进入board目录,将smdk2410复制为100ask24x0,并将board/100ask24x0/smdk2410.c改名为100ask24x0.c。 3、将include/configs/smdk2410.h直接复制为100ask24x0.h 4、修改以下两个Makefile,先看顶层的Makefile,增加底部
[单片机]
<font color='red'>U-Boot</font>移植(1)新建一个开发板的相应目录和文件
U-boot在S3C2440上的移植详解(一)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 本次移植的功能特点包括: 支持Nand Flash读写 支持从Nor/Nand Flash启动 支持CS8900或者DM9000网卡 支持Yaffs文件系统 支持USB下载(还未实现) 1. 了解u-boot主要的目录结构和启动流程,如下图。 u-boot的stage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言
[单片机]
<font color='red'>U-boot</font>在S3C2440上的移植详解(一)
U-boot在S3C2440上的移植详解(五)
一、移植环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand,Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2.tgz u-boot:u-boot-2009.08.tar.bz2 二、移植步骤 9)实现u-boot对yaffs/yaffs2文件系统下载的支持。 注意:此篇对Nand的操作是基于MTD架构方式,在“u-boot-2009.08在2440上的移植详解(三)”中讲到过。 通常一个Nnad Flash存储设备由若干块组成,1个块由若干页组成。一般128MB以下容量的Nand Flash芯片,一页大小为528B,被依次分为2
[单片机]
<font color='red'>U-boot</font>在S3C2440上的移植详解(五)
ATMega48的Bootloader的软件实用方法
AVR是Atmel公司推出的第一款真正意义上的RISC结构8位单片机,具有先进的指令集及单时钟周期指令执行时间,数据吞吐率可高达1MIPS,其性能明显优于其他类型8位单片机。 作为AVR主流产品,Mega系列的很多产品(Mega8/Megal6/Mega32/Mega8535等)在硬件上都支持Boot-loader功能。这样MCU可灵活运行BOOT区程序,实现在应用编程(IAP)及一些高级应用,如系统智能升级,密码校验自保护,远程系统更新等。但有很高性价比的Mega48在硬件上却不支持Bootloader功能。因此,本文针对Mega48首次提出两种软件实现Bootloader的方法:跳转保存法和倒置法。 1 ATMega
[单片机]
2440的flash、linux、bootloader
开始拿到2440板的时候不知道norflash ,nandflash等等干什么的,还有SDRAM有是什么,还有linux系统装在哪里,怎么装,supervivi有是什么等等很多的问题,今天大概简单的理清楚这里关系。 首先分开flash与SDRAM,这俩个其实我们都使用过,flash,U盘就是一块flash,主要是掉电不易失,至于norflash和nandflash都是flash只是工艺,读写速度,性能,造价等等不同,一般说nandflash可以做的很大,现在大的可以有几G了,好多开发板上面都是1G的了,而且造价便宜,但是nandflash容易产生坏块。而norflash一般比较小,几M,造价比较贵,但是不容易产生坏块,性能较好
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved