Uboot启动流程分析(四)

1、前言

在前面的文章Uboot启动流程分析(三)中,链接如下:

https://www.cnblogs.com/Cqlismy/p/12006287.html

已经对init_sequence_f前半部分函数进行了简单分析,前半部分主要是对调试串口终端进行了初始化,以及输出了一些必要的字符串,接下来,本篇文章将对init_sequence_f后半部分函数进行分析,后半部分主要是对DRAM的内存进行分配,并对gd的相关结构体成员进行初始化,在init_sequence_f函数初始化列表中,已经执行到了setup_dest_addr()函数,后半部分初始化列表如下:

/* 初始化序列函数数组 */
static init_fnc_t init_sequence_f[] = {

  ...  ...
    /*
     * Now that we have DRAM mapped and working, we can
     * relocate the code and continue running from DRAM.
     *
     * Reserve memory at end of RAM for (top down in that order):
     *  - area that won‘t get touched by U-Boot and Linux (optional)
     *  - kernel log buffer
     *  - protected RAM
     *  - LCD framebuffer
     *  - monitor code
     *  - board info struct
     */
    setup_dest_addr,/* 设置目的地址(gd->ram_size,gd->ram_top,gd->relocaddr) */
    reserve_round_4k,    /* 对gd->relocaddr做4K对齐 */

#if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) && \
        defined(CONFIG_ARM)
    reserve_mmu,    /* 留出mmu的TLB表位置 */
#endif

    reserve_trace,    /* 留出ddr调试追踪的内存 */

#if !defined(CONFIG_BLACKFIN)
    reserve_uboot,    /* 留出重定位uboot占用的位置 */
#endif

#ifndef CONFIG_SPL_BUILD
    reserve_malloc,    /* 留出malloc的内存位置和ENV的内存大小 */
    reserve_board,    /* 留出bd所占用的内存大小(80字节) */
#endif

    setup_machine,    /* 对于i.mx6ul该函数无效 */
    reserve_global_data,    /* 留出gd_t结构的内存大小(248字节) */
    reserve_fdt,    /* 留出设备树的内存大小(i.mx6ul没有用) */
    reserve_arch,    /* 空函数 */
    reserve_stacks,    /* 留出栈空间(16字节)并做16字节对齐 */
    setup_dram_config,    /* 设置DRAM的信息 */
    show_dram_config,    /* 显示DRAM的位置 */
    display_new_sp,    /* 显示新的sp位置 */
    INIT_FUNC_WATCHDOG_RESET
    reloc_fdt,    /* 重定位fdt(没有用) */
    setup_reloc,    /* 设置gd结构体的一些其他成员 */
    NULL,
};

2、board_init_f函数

程序将调用setup_dest_addr()函数,该函数的定义如下:

DRAM的最后内存配示意图如下所示:

3、小结

原文地址:https://www.cnblogs.com/Cqlismy/p/12147411.html

时间: 2024-10-09 05:55:02

Uboot启动流程分析(四)的相关文章

u-boot启动流程分析(2)_板级(board)部分

转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global data介绍以及背后的思考 5. 前置的板级初始化操作 6. u-boot的relocation 7. 后置的板级初始化操作 1. 前言 书接上文(u-boot启动流程分析(1)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_i

Uboot启动流程分析(五)

1.前言 在前面的文章Uboot启动流程分析(五),链接如下: https://www.cnblogs.com/Cqlismy/p/12147411.html 已经对board_init_f() 函数作出了简单的分析,该函数对一些早期的外设进行了初始化,例如调试串口,并填充了gd_t结构体中的成员变量,最主要的是对整个DRAM的内存进行了分配,以便uboot的重定位,接下来,先回顾一下_main函数的大概流程,如下: _main | board_init_f_alloc_reserve-->re

u-boot启动流程分析(1)_平台相关部分

转自:http://www.wowotech.net/u-boot/boot_flow_1.html 1. 前言 本文将结合u-boot的“board—>machine—>arch—>cpu”框架,介绍u-boot中平台相关部分的启动流程.并通过对启动流程的简单分析,掌握u-boot移植的基本方法. 注1:本文所使用的u-boot版本,是2016/4/23从u-boot官网(git://git.denx.de/u-boot.git)导入的一个快照,具体可参考“https://github

am335x uboot启动流程分析

基本指令含义 .globl _start .globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号 b,bl b是不带返回的跳转  bl带返回的跳转 .word 插入一个32-bit的数据队列.(与armasm中的DCD功能相同) 芯片到uboot启动流程 :ROM → MLO(SPL)→ uboot.img 启动脚本:/u-boot2011.09/arch/arm/cpu/armv7/omap-common/u-boot_spl.lds M

Linux嵌入式驱动学习之路⑤u-boot启动流程分析

这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加载u-boot第二阶段代码到RAM空间. 设置好栈. 跳转到第二阶段代码入口. 第二阶段的功能: 初始化本阶段使用的硬件设备. 检查系统内存映射. 将内核从Flash读取到RAM中. 为内核设置启动参数. 调用内核. u-boot启动第一阶段流程 根据连接器脚本 board/samsung/$(BO

新版本uboot启动流程分析

参考页面 友善之臂文章 UBOOT启动过程介绍,非常有用! 启动过程分析 第一阶段 初始化RAM,CPU阶段,准备初始化板 操作时钟,设置CPU模式,设置中断,关看门狗, 底层初始化CPU,初始化RAM,初始化C环境,设置GD全局数据结构 执行board_init_f 第二阶段 前期初始化板阶段,此时已经可以使用串口,显示板子信息,然后重定位代码 board_init_f,其实就是在RAM中设置各种内存,然后重定位跳转过去,好进行下一步继续初始化 执行init_sequence_f 函数数组里面

U-BOOT启动流程分析--start_armboot函数(二)

第二阶段的功能: 初始化本阶段所需的硬件设备(主要设置系统时钟.初始化串口.Flash.网卡.USB) 检测系统内存映射(memory map) 将内核映像和根文件系统映象从Flash上读到RAM空间中 为内核设置启动参数 调用内核 从start_armboot开始,程序流程如图 原文地址:https://www.cnblogs.com/y4247464/p/10597504.html

uboot boot流程分析

下面这篇文章分析得比较好: 2014.4新版uboot启动流程分析 http://blog.csdn.net/skyflying2012/article/details/25804209 感谢作者分享

一,移植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