23

U-boot详解:板子上电时都干了些什么

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUzMjcxMzg5Mg%3D%3D&%3Bmid=2247485296&%3Bidx=1&%3Bsn=33b6a9cd899e948426e45fb2d9a0e98c
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

NbMzIjm.jpg!web

U-boot 的全称是Universal Boot Loader,是嵌入式设备中使用的一种开源主引导程序。电子产品如果没有电,跟废品没什么区别,是电赋予了他们生命,然后程序则是他们的灵魂。

小时候一直很好奇,一个个死板的电子产品为什么一上电以后就能够工作了呢?为什么一个小小芯片就能够运行我们编写的程序呢?一个开发板从刚上电到整个操作系统能够运行起来是怎么办到的呢?这些东西困扰了好久,参考了好多资料现在才慢慢弄明白其中一些原理。

如果有玩过单片机的同学应该知道,一个cpu加上一个电源,然后外接一个外部晶振就能够做成一个最小系统了,单片机就能够在他可怜的64k或者128k内存中运行起来了,这些简单的控制芯片虽然有它的存在价值,但是它不能满足日益复杂的计算需求,所以需要更快的运算速度以及更大的运行内存,因此我们会用到更复杂的处理器,比如mips、arm等。下面将使用arm s3c2440 处理器分析上电启动的过程。

作为一个嵌入式产品,它的多样性让它更具有可玩性,以及更容易适应不同的需求,它不像我们的PC启动方式相对比较单一(ROM启动),arm启动方式有从norfalsh启动、nandflash启动、SD卡启动和UBS启动等,但是他们的启动原理都是大同小异的。

开始之前,我们先理清几个概念:

SDRAM(Synchronous Dynamic Random Access Memory):同步动态随机存取存储器,同步是指Memory工作需要步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是由指定地址进行数据读写,简单的说,它就是cpu使用的外部内存,即我们常说的内存条。

SRAM是英文Static RAM的缩写,它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据,速度比SDRAM快,一般用作高速缓冲存储器(Cache)。

norflash:非易失闪存,是一种外部存储介质,芯片内执行(XIP,eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中,由于它有地址总线,cpu可以直接从norflash中取指,直接从FLASH中运行程序,但是工艺复杂,价格比较贵,容量较小(1~4M),NOR的传输效率很高,cpu可以从norflash中读取数据,但是写入数据的时候需要指定的命令才能写入,而且每次写入之前都要执行擦除动作,决定了它的运行速度不会太快。

nandflash:它也是非易失闪存(掉电不丢失)的一种,但是它虽然有数据总线,但是没有地址总线,所以cpu不能直接从NANDFLASH中取指运行,由于它价格便宜,所以常常用来存储大量数据,和我们常说的硬盘类似。

下面将解析nandflash启动和norflash启动两种方式(arm s3c2440),其他启动方式将在uboot代码部分分析。

Nandflash启动

JnQrqaN.jpg!web

首先必须把一个正确的bootload烧写到nandflash的最低位置,即从0x000开始烧写。当我们选择从nandflash启动开发板的时候,开发板就会启动连接nandflash的电路结构,当开发板一上电的时候,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到CPU的内部RAM中(SRAM),这个内部RAM我们通常称作stepping stone,同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000),CPU从内部RAM的0x00000000位置开始启动,这个过程不需要程序干涉的。

这个过程就是启动过程的stage1,它将nandflash的前4k内容拷贝到stepping stone中,然后从stepping stone的第一条指令开始执行,这4k内容里面的指令将会完成以下几个动作:

1.硬件设备初始化

2. 加载U-Boot第二阶段代码到SDRAM空间

3. 设置好栈

4. 跳转到第二阶段代码入口

从下图我们可以看到,板子重置以后,内存的映射关系。从图中可以看到以下几点:

1.刚开始bank0~bank5是只能映射SROM的,而bank6和bank7才能够接SDRM,而且每个bank最大接128M的SDRM,所以决定了S3C2440的最大可外接SDRAM是256M;

2.从图中我们可以看到bank6的起始地址是0x3000_0000, 所以我们在执行stage1的第二个动作(加载U-Boot第二阶段代码到SDRAM空间)时,需要将uboot代码放到0x3000_000~0x4000_0000区间内(SDRAM内),才能从SDRAM中正常执行stage2;

3.当没有选择从nandflash启动时,Boot internal SRAM(4k)的起始地址是0x4000_0000, 当选择从nandflash启动时,Boot internal SRAM(4k)的起始地址是0x00, 因为我们的开发板没有外接SROM,所以bank1~bank5都是空闲的,而bank0的位置将被Boot internal SRAM(4k)替代,也就是说bank0的前4k就是stepping stone(起步石),板子上电以后,在nandflash的启动模式下,S3C2440在硬件上会完成下图中的地址映射,并自动将nandflash中的前4k拷贝到stepping stone中,并从stepping stone的开始地址(0x00)获取到第一条指令并执行。

QB3qEjQ.jpg!web

经过上面的分析后,我们可以将上面两图合并成下图所示:

VfIzYjn.jpg!web

前面说了nandflash启动过程中第一个代码搬移,下面将解析第二个代码搬移,这4k代码首先会设置cpu运行模式,关看门狗,设置时钟,关中断,初始化内存,初始化nandflash,设置堆栈,然后将整个bootload搬运到SDRAM中,并跳转到SDRAM中执行。

基本过程如下图所示:

y6ny6fb.jpg!web

在新的uboot-2015中,这4k代码是由uboot_spl.bin完成的,下面将基于uboot-2015.10 列出uboot从上电到启动内核的整个过程进行概述:

jUNFFvi.jpg!web

本文转载自: https://blog.csdn.net/lee244868149/article/details/49681987 


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK