u-boot2011.09 u-boot.img 的流程跟踪

  • 一、主要是start.S 里面的 board_init_f 以及 board_init_r 函数分析,MLO与 u-boot.omg 的区别就在这里

  • 二、 MLO 加载完毕,他会重新回到 start.S 重新开始

  • 三、 board_init_f 函数的实现在 arch/arm/lib/board.c 里面

    264 void board_init_f(ulong bootflag)
    265 {
    266     bd_t *bd;
    267     init_fnc_t **init_fnc_ptr;
    268     gd_t *id;
    269     ulong addr, addr_sp;
    270
    271
    272     /* Pointer is writable since we allocated a register for it */
    273     gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);
    274     /* compiler optimization barrier needed for GCC >= 3.4 */
    275     __asm__ __volatile__("": : :"memory");
    276
    277     memset((void *)gd, 0, sizeof(gd_t));
    278
    279     gd->mon_len = _bss_end_ofs;
    280     // 这里有一个函数指针数组,里面包含很多初始化
    281     for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
    282         if ((*init_fnc_ptr)() != 0) {
    283             hang ();
    284         }
    285     }
               // ... ...
    412     gd->bd->bi_baudrate = gd->baudrate;
    413     /* Ram ist board specific, so move it to board code ... */
    414     dram_init_banksize();
    415     display_dram_config();  /* and display it */
    416
    417     gd->relocaddr = addr;
    418     gd->start_addr_sp = addr_sp;
    419     gd->reloc_off = addr - _TEXT_BASE;
    420     debug("relocation Offset is: %08lx\n", gd->reloc_off);
    421     memcpy(id, (void *)gd, sizeof(gd_t));
    422
    423     relocate_code(addr_sp, id, addr);   // 最后回到 start.S  然后又到了 board_init_r
    424
    425     /* NOTREACHED - relocate_code() does not return */
    426 }
  • 接上函数指针数组 init_sequence

    235 init_fnc_t *init_sequence[] = {
    236 #if defined(CONFIG_ARCH_CPU_INIT)
    237     arch_cpu_init,      /* basic arch cpu dependent setup */
    238 #endif
    239 #if defined(CONFIG_BOARD_EARLY_INIT_F)
    240     board_early_init_f,
    241 #endif
    242     timer_init,     /* initialize timer */
    243 #ifdef CONFIG_FSL_ESDHC
    244     get_clocks,
    245 #endif
    246     env_init,       /* initialize environment */
    247     init_baudrate,      /* initialze baudrate settings */
    248     serial_init,        /* serial communications setup */
    249     console_init_f,     /* stage 1 init of console */
    250     display_banner,     /* say that we are here */
    251 #if defined(CONFIG_DISPLAY_CPUINFO)
    252     print_cpuinfo,      /* display cpu info (and speed) */
    253 #endif
    254 #if defined(CONFIG_DISPLAY_BOARDINFO)
    255     checkboard,     /* display board info */
    256 #endif
    257 #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)
    258     init_func_i2c,
    259 #endif
    260     dram_init,      /* configure available RAM banks */
    261     NULL,
    262 };
  • 三、board_init_r 也在 arch/arm/lib/board.c

    443 void board_init_r(gd_t *id, ulong dest_addr)
    444 {
    445     char *s;
    446     bd_t *bd;
    447     ulong malloc_start;
    448 #if !defined(CONFIG_SYS_NO_FLASH)
    449     ulong flash_size;
    450 #endif
    451
    452
    453     gd = id;
    454     bd = gd->bd;
    455
    456     gd->flags |= GD_FLG_RELOC;  /* tell others: relocation done */
    457
    458     monitor_flash_len = _end_ofs;
    459
    460     /* Enable caches */
    461     enable_caches();
    462
    463     debug("monitor flash len: %08lX\n", monitor_flash_len);
    464     board_init();   /* Setup chipselects */
    465
    466 #ifdef CONFIG_SERIAL_MULTI
    467     serial_initialize();
    468
    469 #endif
    81     /* The Malloc area is immediately below the monitor copy in DRAM */
    482     malloc_start = dest_addr - TOTAL_MALLOC_LEN;
    483     mem_malloc_init (malloc_start, TOTAL_MALLOC_LEN);
    484
    485     stdio_init();   /* get the devices list going. */
    486
    487     puts("zengjf :\n");
    523 #if defined(CONFIG_CMD_NAND)
    524     puts("NAND :  ");
    525     nand_init();        /* go init the NAND */
    526 #endif
    // ... ...
    531
    532 #ifdef CONFIG_GENERIC_MMC
    533        puts("MMC:   ");
    534        mmc_initialize(bd);
    535 #endif
    // .. ...
    559
    560     console_init_r();   /* fully init console as a device */
    561
    566 #if defined(CONFIG_MISC_INIT_R)
    567     /* miscellaneous platform dependent initialisations */
    568     misc_init_r();
    569 #endif
    
    // ... ...
    649     for (;;) {
    650         main_loop();
    651     }
    652
    653     /* NOTREACHED - no way out of command loop except booting */
    654 }
  • u-boot 加载 kernel 参考:

    http://www.cnblogs.com/chenfulin5/p/6937334.html

  • MLO 的流程参考:

    http://www.cnblogs.com/chenfulin5/p/8398399.html

原文地址:https://www.cnblogs.com/chenfulin5/p/8398816.html

时间: 2024-11-13 10:00:49

u-boot2011.09 u-boot.img 的流程跟踪的相关文章

I.MX6 Linux Qt 启动流程跟踪

/************************************************************************** * I.MX6 Linux Qt 启动流程跟踪 * 声明: * 1. 源代码来源MY-I.MX6: * 2. 本文仅仅是对启动流程的解析,没有解释启动流程为什么是这样的问题. * * 2015-6-13 深圳 晴 南山平山村 曾剑锋 *********************************************************

集成activiti-modeler 到 自己的业务系统(集成流程跟踪-完美支持IE)

本文目的: 将activit 5.12.1 的 modeler 流程设计器 集成到自己的工程中去 解决问题: 1. 复制相关资源文件到自己的工程中 2. 解决modeler的路径访问问题,迁移到非系统根目录 3. 跟自己系统的spring无缝集成 首先请下载官方最新 5.12.1 发布包 下载地址: https://github.com/Activiti/Activiti/archive/activiti-5.12.1.zip 解压后如下图 步骤: 1. 复制相关文件 1.1首先复制类路径资源文

Spring Boot :Request请求处理流程

技术交流群:233513714

springmvc流程跟踪

springmvc的执行流程前端控制器继承自servlet方法我们在dispatcherServlet里找到doService方法进入:  this.doDispatch(request, response); 里面是定义一些参数,主要的是:  mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); 大致是调用控制器方法,执行的是RequestMappingHandlerAdapter(是HandlerAda

spring boot 源码解析 启动流程

spring boot 源码解析 启动流程 在面试过程中经常被问到过spring boot的启动流程,今天就翻一下源码整体看一下: 首先,新建一个启动类,可以看到是首先调用的SpringApplication的静态方法run @SpringBootApplication public class SourceReadApplillcation { public static void main(String[] args) { SpringApplication.run(SourceReadAp

第14章 Linux开机详细流程

本文目录: 14.1 按下电源和bios阶段 14.2 MBR和各种bootloader阶段 14.2.1 boot loader 14.2.2 分区表 14.2.3 采用VBR/EBR方式引导操作系统 14.3 grub阶段 14.3.1 使用grub2时的启动过程 14.3.2 使用传统grub时的启动过程 14.4 内核加载阶段 14.4.1 加载init ramdisk 14.4.2 initrd 14.4.3 initramfs 14.5 操作系统初始化 14.5.1 运行级别 14.

《Spring Boot 入门及前后端分离项目实践》系列介绍

课程计划 课程地址点这里 本课程是一个 Spring Boot 技术栈的实战类课程,课程共分为 3 个部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 项目实践开发.Spring Boot 介绍.前后端分离.API 规范等内容旨在让读者更加熟悉 SpringBoot 及企业开发中需要注意的事项并具有使用 SpringBoot 技术进行基本功能开发的能力:这最后的项目实战为课程的主要部分,我会带着大家实际的开发一个前后端分离的 Spring Boot 实践项目,

spring boot应用启动原理分析

spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar/war是可以直接启动的,不需要另外配置一个Web Server. 如果之前没有使用过spring boot可以通过下面的demo来感受下. 下面以这个工程为例,演示如何启动Spring boot项目: git clone [email protected]:hengyunabc/spring-boot-demo.git mvn spring-b

[转] Spring Boot 揭秘与实战(二) 数据存储篇 - ElasticSearch

[From] http://www.tuicool.com/articles/JBvQrmj 本文讲解Spring Boot基础下,如何使用 ElasticSearch,实现全文搜索. 版本须知 spring data elasticSearch 的版本与Spring boot.Elasticsearch版本需要匹配. Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z) x