uboot启动过程理解

对于2440而言,启动的方式不多。一般就是外界一个NAND FLASH ,2440内部有个NAND FLASH
Controller,会自动把NAND FLASH的前4K拷贝到2440的片内SRAM。2440这个片内SRAM就是所谓的
Stepping Stone刚好也是4K。
    在制作启动代码时,就是uboot。一般会把uboot分为两个部分,一般就会叫做BL1和BL2。
BL1和BL2两者相加就是整个uboot。这两个部分各有分工。
    为了符合2440的特点,BL1的大小会被设置为4K,这4K需要完成的任务有:
1、配置好内存(对于2440来说,内存就是SDRAM)。
2、配置好内存后,将整个uboot搬运到SDRAM运行。
    此时BL1的使命就完成了,接下来是BL2,他在SDRAM上运行,将FLASH上的OS也搬运到SDRAM
运行。那么整个boot的过程就完成了。

芯片换代升级,变成S5PV210,此时启动的方式不想2440那么单一了,如SD卡启动,emmc启动,USB启动,等等启动方式,其次外部的内存也不再是SDRAM这种简单的内存了,而是DDR这种内存。所以一开始需要做的准备工作大大增加。
所以,S5PV210内部多了一个叫做IROM的东西,他的内部固化了一下程序,在上电之后IROM会启动内部的程序,将外部的某些设备进行简单的初始化,如SD卡,emmc等。
内部的SRAM也从4k升级到了96k.就是为了满足更复杂的配置要求。

那么接下来,来看看三星官方推荐的uboot启动过程


    和2440启动过程类似,在上电的时候它会自动将外部的固定大小的程序拷贝到片内的SRAM。
对于2440来讲,这个大小是4K。而对于210来讲这个大小是16K。
    假设,我们现在选择的是SD卡启动,那么我们的uboot当然会放到SD卡中。同理为了满足,
210的特性,uboot同样会被分为两个部分——BL1和BL2;BL1的大小当然就是16K。
    那么,在上电之后,这个16K会被自动的拷贝到片内的SRAM,这个过程由芯片内部的
IROM完成(这个过程通常被称之为BL0)。而此时片内的SRAM并没有被填满,还有80K的容量。
    三星想,这80K的容量也够BL2放的了。所以,按照三星设想,当BL1被加载到SRAM之后。
BL1开始运行,此时BL1的任务只要把BL2也搬运到SRAM就可以了。然后让BL2去配置DDR,
并且将OS搬运到DDR运行。
    也就是说,三星给BL1分配的任务是搬运BL2到SRAM;给BL2分配的任务是配置DDR并且搬运OS
到DDR运行。

但是,在学校Uboot的过程中,发现Uboot并没有采用三星推荐的启动过程。原因是随着Uboot的
发展,Uboot的大小变得很大,远超过了96K。就是说Uboot无法整个都放入片内的SRAM。那么让就
不能采取三星的方式。
    所以Uboot给BL1和BL2重新分配任务:(当然BL1的大小还只能是16K,这是应为IROM里的程序是固定的,它只会将前16K的内容拷贝到SRAM。)
    Uboot将BL1委以重任,不仅需要将DDR配置好,还要将BL2搬运到DDR上运行。
  BL2就只需要将OS搬运到DDR运行即可。

那么,3星推荐的做法,和Uboot的做法他们的区别就出来的:
1、Uboot交给BL1的任务要比三星交给BL1的任务要多。他首先需要配置DDR,其次再将
BL2搬运到DDR运行。而三星交给BL1的任务,仅仅是将BL2搬运到片内的SRAM运行。
2、UBoot的方式,BL2是在DDR上运行的,而三星的方式BL2是在片内的SRAM运行的。
3、UBoot的方式,BL2只需搬运OS到DDR;三星的方式,BL2需要先配置DDR,在将OS搬运到
DDR。

总结:
1、SRAM他在芯片的内部,他可以直接访问,而无需初始化。而DDR,SDRAM这种外部
内存是需初始化的,需要我们写一些配置程序,初始化之后才可以访问。所以不管是
2440,还是210,还是intel。都遵循逐步启动的过程。
2、对于2440来说,先需要将外部Flash的前4K内容加载到SRAM,然后通过在SRAM里运行的代码
去初始化SDRAM,并搬运主体程序到SDRAM。
3、对于210来讲也是这样,会先将外部Flash的前16K内容拷贝到SRAM。
4、区分BL0 和BL1,BL2。BL0其实是固化在芯片内部的一段程序。而BL1和BL2是组成Boot的两个部分
BL1的大小是必须根据芯片的特性设计的。对于2440来说你的BL1不应该超过4K,对于210来说BL1不应该超过16K。
5、我们自己写boot的时候,也可以参照三星步骤,只要你的BL2不大于80K即可。
7、DDR或者是SDRAM会比片内的SRAM大很多倍,所以只要外部内存被初始化好了之后,很多东西(如BL2)一定程度上就不再受大小的限制了。

时间: 2024-11-08 17:13:36

uboot启动过程理解的相关文章

U-Boot启动过程--详细版的完全分析2

一.初识u-boot 3 1,Bootloader介绍 3 2,Bootloader的启动方式 3 (1)网络启动方式 4 (2)磁盘启动方式 4 (3)Flash启动方式 4 3,U-boot的定义 4 4,u-boot源代码的目录结构 4 5,U-boot中的地址 5 (1)什么是编译地址?什么是运行地址? 5 (2)编译地址和运行地址如何来算呢? 5 (3)为什么要分配编译地址?这样做有什么好处,有什么作用? 5 (4)什么是相对地址? 6 (5)如何去做呢? 6 二.U-Boot总体分析

tiny4412学习之u-boot启动过程

这个文档简要分析了tiny4412自带的u-boot的启动过程,这个u-boot启用了mmu,并且命令的接收和执行方式跟以前的不同. 文档下载地址: http://pan.baidu.com/s/1sjlvzpN

u-boot 启动过程

u-boot 代码分为两个阶段第一阶段是汇编,入口是 arch/arm/cpu/armv7/start.S,第二阶段是 C 语言, 入口是 board.c 第一阶段代码1. 异常向量表定义2. 设置 SVC32 模式(ARM 七种工作模式)3. 调用 cpu_init_crit 进行 cpu 相关初始化1) 清 TLB(页面缓存).关 MMU 及 Cache 等2) 转入低级初始化 lowlevel_init 函数主要是对系统时钟.片外内存(DDR3).串口. nand(这里初始化 nand 主

Am335x u-boot 启动过程中的系统频率配置

Am335x的时钟结构分为:ADPLLS和ADPLLLJ 1.ADPLLS用来配置Core_CLK,Dispaly_clk,ARM系统CLK(mpu_clk),DDR PLLs_clk 2.ADPLLLJ用来为am335x的外设配置时钟 Core_clk的配置: 通过寄存器CM_CLKSEL_DPLL_CORE配置参数M,N来设置CLKDCOLDO的输出,在通过配置寄存器CM_DIV_M4_DPLL_CORE,CM_DIV_M5_DPLL_CORE,CM_DIV_M6_DPLL_CORE来配置C

imx6中uboot启动过程中延时修改的方法

我们需要运用的平台为sail-imx6 系统为linux4.1.15 Linux系统启动时,在uboot阶段有1s延时,想要增大延时或者减少延时应该怎么修改呢? 修改linux的uboot代码: /sail-imx6q-uboot-2015.04/include/configs/mx6sabre_common.h(104行) -#define CONFIG_BOOTDELAY 1 +#define CONFIG_BOOTDELAY 1 这样就没有了1s延时,也可以修改为其他值. 通过上述步骤,大

linux内核启动过程学习总结

下面是学习linux内核启动过程的记录 平台是:powerpc mpc8548 + linux2.6.23 内核 通用寄存器的作用r0 :在函数开始时使用r1 :存放堆栈指针,相当于ia32架构中的esp寄存器r2 :存放当前进程的描述符的地址r3 :存放第一个参数和返回地址r4-r10 :存放函数的参数r11 :用在指针的调用和当前一些语言的环境指针r12 :用于存放异常处理r13 :保留做为系统线程IDr14-r31 :作为本地变量,具有非易失性 Linux启动过程描述 第一步:使用Boot

一,移植uboot,分析uboot启动流程

文档时间:2018-08-08 交叉编译器:arm-linux-gcc-4.3.2 Ubuntu版本:16.04 uboot版本:2013.10 uboot启动流程简要如下: a,设置CPU为管理模式 b,关闭看门狗 c,关闭中断 d,设置时钟频率 e,进入lowlevel_init.S,初始化各个bank f,进入board_init_f()函数 h,代码重定位,清除bss i,跳转到board_init_r(),进入第二阶段 1,进入https://www.amazon.com/cloudd

uboot启动第一阶段--start.S

uboot分为两个阶段:start.S是uboot的第一阶段. 一:引入start.S u-boot.s找到start.S的入口 ①首先在C语言中整个项目的入口就是main函数(这是C语言规定的),所以如果要去了解C语言的项目,从main函数开始,这样才能分析,如果随便拿一个文件就开始看,最后看得一头雾水,对自己没有信心.怎么来找呢?可以使用souceinsight的搜索功能来查找. ②在uboot中因为有汇编阶段参与,因此不能直接找main.c.整个程序的入口取决于连接脚本中ENTRY声明的地

U-Boot工作过程

本文是转载! U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 Ø  硬件设备初始化 Ø  加载U-Boot第二阶段代码到RAM空间 Ø  设置好栈 Ø  跳转到第二阶段代码入口 (2)第二阶段的功能 Ø  初始化本阶段使用的硬件设备 Ø  检测系统内存映射 Ø  将内核从Flash读取到RAM中 Ø  为内核设置启动参数 Ø  调用内核 1.1.1             U-Boot启动第一阶段代码分析 第一阶段对应的文件是cpu/arm920t/sta