u-boot关于启动流程

简介: u-boot关于启动流程

1.关于启动流程

1.1 启动阶段分为3个,bl0,bl1,bl2。下面只是就功能方面对它们做说明,实际设计的时候,也许会对其具体功能做出调整,也就是说,这几个阶段的划分是就功能而言的,不能看得太死。

     bl0:出厂的时候就固化在irom中一段代码,主要负责拷贝8kb的bl1到s5pv210的一个96kb大小内部sram(Internal SRAM)中运行。值得注意的是s5pv210的Internal SRAM支持的bl1的大小可以达到16kb,容量的扩增是为了适应bootloder变得越来复杂而做的。虽然如此,但目前我们制作出来的bl1的大小仍然可以保持在8kb以内,同样能满足需求。

     bl1:u-boot的前8kb代码(s5pv210也支持16kb大小,原因上一点提过了),除了初始化系统时钟和一些基本的硬件外,主要负责完成代码的搬运工作(我设计成搬运bl1+bl2,而不仅仅是bl2),也就是将完整的u-boot代码(bl1+bl2)从nand flash或者mmcSD等的存储器中读取到内存中,然后跳转到内存中运行u-boot。

     bl2:完成全面的硬件初始化和加载OS到内存中,接着运行OS。

上述几个阶段的流程描述在s5pv210_irom_application手册中有详细描述。见下图1:

image.png

图1

1.2 首先把启动部分的代码分为3部分,以start.S为主,另外还有lowlevel_init.S,mem_setup.S,ctr0.S。

     其中lowlevel_init.S主要是一部分硬件的初始化,尤其是系统时钟和DRAM的初始化。如果u-boot一旦被搬运到内存中运行,那么是必须要跳过时钟和DRAM的初始化的,因为这在搬运之前已经做过了。并且如果代码在内存中运行的时侯你却去初始化DRAM,那必然导致崩溃!

    mem_setup.S:DRAM初始化代码和MMU相关代码放在这个文件中。

    ctr0.S:u-boot自带的代码文件,存放汇编函数main。

1.3 启动代码相关的几个文件在u-boot中的路径

   start.S:            /arch/arm/cpu/armv7/start.S (需要自己修改)

   lowlevel_init.S:/board/samsung/zsy210/ lowlevel_init.S  (需要自己修改)

   mem_setup.S:   /board/samsung/zsy210/ mem_setup.S   (u-boot没有,需要自己添加)

   ctr0.S:            /arch/arm/lib/ctr0.S  (u-boot自带,一般不需要修改)


2. 启动过程原理

     必须要明白的一点是,当代码从存储介质(nand flash,SD,norflash,onenand等)中搬运到了DRAM中后随即会跳转到内存中运行u-boot,接着会有一个重定位(relocate_code)的过程,relocate_code子函数在start.S中,而给relocate_code子函数传参数的是crt0.S中的main子函数。当判断到当前u-boot在内存的低地址处,那么relocate_code就会工作,把u-boot代码从低地址处再搬运到内存地址的顶端,然后跳转到新的位置去继续运行u-boot。而搬运的目标地址是在board_init_f()函数(此函数在/arch/arm/lib/board.c中)中计算出来的,见图2。

image.png

图2

      下面,以start.S为主线,画出了其程序流程图,图中同样也表现出启动的整个流程和启动代码文件间的组织关系。所以后面直接贴出start.S的完整代码,大家结合流程图相信都可以看明白,至于逐句汇编的分析不是本文的重点。见图3.

image.png

图3

目录
相关文章
|
5月前
|
监控 Java Spring
深入理解Spring Boot的启动过程
深入理解Spring Boot的启动过程
|
6月前
|
Java Spring 容器
深入理解Spring Boot启动流程及其实战应用
【5月更文挑战第9天】本文详细解析了Spring Boot启动流程的概念和关键步骤,并结合实战示例,展示了如何在实际开发中运用这些知识。
190 2
|
Java 应用服务中间件 Spring
源码解析Spring Boot 的启动流程
最近有位开发同学说面试被问到Spring Boot 的启动流程,以及被问到Spring Boot 的嵌入式Web容器是什么时候加载的。如何加载的。是怎么无缝切换的。这些问题,其实回答起来也是比较复杂的。我们今天就从 `SpringApplication.run(Application.class, args);`入口,逐渐向下看下执行流程。来试着回答一下前面这两个问题。后面关于SpringBoot 的web容器可以无缝随意切换为`jetty`,`undertow.`.这个问题的回答涉及到Spring Boot是如何设计WebServer的。我们后续专门讲解一下。
11177 1
源码解析Spring Boot 的启动流程
|
IDE Java Maven
spring boot的项目启动方式有几种及详解?
spring boot的项目启动方式有几种及详解?
|
存储 XML Java
Spring启动过程源码分析
本文是通过 AnnotationConfigApplicationContext读取配置类来一步一步去了解Spring的启动过程。 在看源码之前,我们要知道某些类的作用,这样更方便后续的了解。
Spring启动过程源码分析
|
Java Spring
Spring Boot Logback启动流程
Spring Boot 默认使用的是 Logback 的日志框架、Logback 的组件主要通过 Spring Boot ApplicationListener 启动的
325 0
|
Java
深入理解 NioEventLoop启动流程
深入理解 NioEventLoop启动流程
157 0
|
Java Spring 容器
Spring 启动过程(下)
Spring 是我们最常用的框架之一,我们今天一起来带大家一些探究一下 Spring 的启动过程。 首先,Spring 的启动过程分为 12 个步骤主要是完成容器的初始化,以及对单实例非懒加载 Bean 完成创建和Bean 属性的赋值注入和初始化,以及消息派发器的创建和启动过程消息的触发。 补充:本文和后续版本基于 spring-5.1.14 版本展开
137 0
|
前端开发 Java Spring
Spring 启动过程(上)
Spring 是我们最常用的框架之一,我们今天一起来带大家一些探究一下 Spring 的启动过程。 首先,Spring 的启动过程分为 12 个步骤主要是完成容器的初始化,以及对单实例非懒加载 Bean 完成创建和Bean 属性的赋值注入和初始化,以及消息派发器的创建和启动过程消息的触发。 补充:本文和后续版本基于 spring-5.1.14 版本展开
429 0