(1)uboot详解——板子刚上电时都干了些什么

电子产品如果没有了电,就跟废品没什么区别,是电赋予了他们生命,然而程序则是他们的灵魂。

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

我们现在接触的大多数电子产品都是使用数字电路设计出来的,数字电路的精髓就是两个数字:0和1,这两个数字千变万化的组合创造了计算机世界的缤纷多彩,不管是cpu、内存还是其他外设都是通过0和1的变化来进行记录、交互以及计算。硬件是怎么操作这两个数字以及这两个数字是怎么控制硬件工作的,这里不进行讨论,那都是一些二极管、三极管、与非门、信号放大取样编码等等知识,所以这里将对一个个功能完整的芯片,从上电以后,他们通过电信号完成各种操作的过程进行解析。如果有玩过单片机的同学应该知道,一个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的传输效率很高

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

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

一、 Nandflash启动

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

这个过程就是启动过程的stage1,它将nandflash的前4看内容拷贝到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)获取到第一条指令并执行。

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

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

基本过程如下图所示:

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

二、norflash启动

其实理解了nandflash的启动方式,norflash的启动也就好理解多了,首先需要知道的是norflash是可以在片上执行代码(XIP)的,也就是说,我们只需要将bootload烧写到norflash的开始地址,当开发板上电以后,从内存映射图可以知道,nor flash会被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000,不会改变),然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)整个uboot,直到引导内核启动。

从norflash启动可以省事多了,不仅如此,我们自己编写的裸机程序需要调试,一般也是直接烧写到norflash中进行的,因为只要我们将编译好的可执行文件放到norflash的开始,开发板上电以后就会从norflash的第一条指令开始取指执行,我们后面写裸机程序的调试就是用这种方式进行的。

从norflash启动虽然从开发的角度会很方便(其实也方便不了多少),但是从产品的角度却增加了它的成本,毕竟norflash还是相对较贵的,我们明明只要一块nandflash就足够启动整个开发板了,就没必要在产品中添加一块norflash了,只要代码改改就能省下不少成本,何乐不为。而且nandflash对产品是必不可少的,因为后面还要存放内核和文件系统,起码需要几十兆的空间,用norflash来存储也不现实。

也许你会想,能不能只用norflash,不用nandflash和SDRAM行不行呢,毕竟norflash即可以存储,也可以运行程序的啊,从理论来说是可以的,但是了解一下他们的市场价格、运行速度和工作原理,应该就会知道答案了。

总结

这里只例举了两种启动方式,还有其他的启动方式将在uboot代码中分析,这篇文章只是一个引子和一个概述,后面将具体分析一个开发板是怎么从一个废品通上电以后体现了它的价值,请看后面的文章,了解bootload中的前4k代码到底干了什么!

声明:文章为个人原创,转载请声明

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 06:36:10

(1)uboot详解——板子刚上电时都干了些什么的相关文章

(4.3)uboot详解——异常和异常向量

(4.3)uboot详解--异常和异常向量 中断是一个较难掌握知识,因为它是一个过程,而不是一个结果,其中的步骤都建立在理论的层面上,需要理解.比如按下按键1会使led1亮,这个"起因-结果"的操作我想小孩子也能掌握,因为它是一个现象,但是要掌握"起因-过程-结果"却需要花一些功夫,因为这个过程需要理解.如果你认真的了解了前面两节的内容,那么现在就该到了实现"过程"的时候了. 前面两节分析了外部中断和内部中断相关的内容,这篇文章将对处理器的异常情

(3)uboot详解——饿了么,我们来喂“狗”吧

(3)uboot详解--饿了么,我们来喂"狗"吧 uboot启动时,当将cpu运行模式设置为管理模式后,就要关闭看门狗了,那么看门狗是干什么的呢? 狗狗是我们的好朋友,有时候,一条好狗狗能够救主人的性命,"看门狗"是cpu的"好朋友",它也能够在cpu出状况的时候把它救活. 看门狗其实就是一个可以在一定时间内被复位的计数器,当看门狗启动后,计数器开始自动计数,经过一定时间,cpu就会将这个计数器复位,如果没有被复位,计数器溢出就会对CPU产生一个

linux移植u-boot(一)——U-Boot详解+自定义命令实战

linux移植u-boot(一)--U-Boot详解+自定义命令实战 2015-02-07 一.Bootloader ????简单地说:Bootloader主要功能就是 在系统上电时开始执行,初始化硬件和设备,准备好软件环境,最后调用操作系统. ????具体的包含:关闭你看门狗WATCHDOG,改变系统时钟,初始化存储控制器 ,将操作系统内核代码复制到内存中去运行. ????为了开发方便,可以增加网络功能,从PC上通过串口或者网络下载文件,烧写文件,将flash上的内核代码解压后运行等. Boo

(5.2)uboot详解——省电模式(番外)

(5.2)uboot详解--省电模式(番外) 这篇文章将对uboot的省电模式进行分析,这里介绍的内容与uboot的启动其实关系不大,如果关心uboot的启动过程,可以跳过这节以及后面的小节,直接到第6章. 省电模式和cpu的工作模式(异常)其实关系也不大,省电模式主要是依靠时钟来分类的,因为外设的工作必须要时钟,当停止给外设提供时钟的时候,相应的外设也会停止工作,所以省电管理就是根据控制是否给相应的设备提供时钟或电源来达到节电的目的. ARM有四中节电模式: 普通模式:这种模式下,会给所有的外

loadView在App启动时到底都干了些什么?

loadView在App启动时到底都干了些什么? 查阅苹果官方文档如下: 1. 当你访问一个ViewController的view属性时,如果此时view的值是nil,那么,ViewController就会自动调用loadView这个方法.这个方法就会加载nib文件或者创建一个空的view对象(self.view = nil). 2.使用nib文件创建view时,没必要重载loadView方法,因为loadView的作用就是加载nib.如果你非要重载,那么必须调用[super loadView]

Ajax详解及使用Ajax时的返回值类型有哪些?

Ajax详解 Ajax = 异步 JavaScript 和 XML. Ajax 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新.这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新. 传统的网页(不使用 Ajax)如果需要更新内容,必需重载整个网页面. (注:图片来自网络) 如何使用Ajax技术 首先,需要获取XMLHttpRequest对象: var xhr; xhr = new XMLHttpRequest(); XMLH

java SSH框架详解(面试和学习都是最好的收藏资料)

Java—SSH(MVC)1. 谈谈你mvc的理解MVC是Model—View—Controler的简称.即模型—视图—控制器.MVC是一种设计模式,它强制性的把应用程序的输入.处理和输出分开.MVC中的模型.视图.控制器它们分别担负着不同的任务.视图: 视图是用户看到并与之交互的界面.视图向用户显示相关的数据,并接受用户的输入.视图不进行任何业务逻辑处理.模型: 模型表示业务数据和业务处理.相当于JavaBean.一个模型能为多个视图提供数据.这提高了应用程序的重用性控制器: 当用户单击Web

Linux中Uboot详解

在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分. 2. Linux 内核.特定于嵌入式板子的定制内核以及内核的启动参数. 3. 文件系统.包括根文件系统和建立于 Flash 内存设备之上文件系统.通常用 ram disk 来作为 root fs. 4. 用户应用程序.特定于用户的应用程序.有

[转] css3中-webkit-text-size-adjust详解(font-size<12px时)

1.当样式表里font-size<12px时,中文版chrome浏览器里字体显示仍为12px,这时可以用 html{-webkit-text-size-adjust:none;} 2.-webkit-text-size-adjust放在body上会导致页面缩放失效 3.body会继承定义在html的样式 4.用-webkit-text-size-adjust不要定义成可继承的或全局的