前言

本文主要是基于大家比较熟悉的 s3c2410 ,对移植 u-boot 时 stage1 过程进行一个分析,网上关于之方面的资料很多,但是几乎都只是对代码作注解,容易让人产生知其一不知其二的感觉,在这里,我主要结合 u-boot 的 stage1 时的内存布局和 stage1 的具体指令来做个分析,这样看起来比较直观,更容易理解一些 .

一、 全局看 u-boot

我们要深入理解 u-boot 如何工作的,以及跟硬件都有什么依赖,我们需要先对 u-boot 及硬件有一个全局的认识。

在这之前,为了更多的人不会迷糊一些问题,先澄清几个概念:

_start : 这是 u-boot 的第一条指令入口地址 , 如果从 flash 启动,就是 0x0, 如果直接下载到 SDRAM 中执行,则是 TEXT_BASE=0x33F80000.

_TEXT_BASE :本身是一个地址,但是地址处放的内容是 TEXT_BASE,

s3c2410 中我们通常设为 0x33F80000, 通过 config.mk 中的 -Ttext $(TEXT_BASE) 来指定链接选项,从而更新链接脚本中的入口地址,不明白的去查查 linker and loader.

见 cpu/arm920t/start.S

_TEXT_BASE:

.word TEXT_BASE

  _armboot_start : 本身也是一个地址,但是地址处放的内容是 _start ,如果 _start 是 0x33F80000, 那 _artboot_start 放的内容就是 0x33F80000 ,见 cpu/arm920t/start.S

_armboot_start:

.word _start

知道这三个地址之后,再看两条指令:

adr r0,_start

这条指令网上讲得也很多,翻译过来就是 add r0,r0,[PC+#offset], 就是把通过一个地址来知道 _start 处的地址,注意是地址,即 TEXT_BASE=0x33F80000, 这步在链接的时候就已经确定了,或者你不用管那么多,你知道链接完成之后,这条指令相当于 mov r0,0x33F80000(sdram) 或者 mov r0,0x0(flash) 就行了。

ldr r1,_TEXT_BASE

注意,这里的 ldr 不是伪指令,伪指令表示时, ldr r1,=_TEXT_BASE

这两个的区别在于,伪指令是直接把 _TEXT_BASE 写入到 r1 中,这里 _TEXT_BASE 就代表一个地址,而 ldr r1,_TEXT_BASE, 是把 _TEXT_BASE 中存放的内容,也就是 TEXT_BASE=0x33F80000 写入到了 r1.

ldr    r2, _armboot_start

结合上面讲的,应该知道,这条语句实际上是将 _armboot_start 中的内容,也就是 _start 的地址写入到了 r2 中,而非网上很多人问的是 _armboot_start 的地址 .

ldr    r3, _bss_start

这跟上面一样分析了,定义见 cpu/arm920t/start.S

.globl _bss_start

_bss_start:

.word __bss_start

下面这两条语句也就好理解了:

sub       r2, r3, r2

add r2, r0, r2

到底 armboot 的大小都包含了哪些东西,结合 u-boot.lds ,见下图:

关于链接脚本,讲起来又很多了,不清楚的,建议看看 linker and loader ,清楚代码的编译链接及加载过程,是我们更深入的理解底层机制的根本。

在上面,我只是讲了几个平时可能遇到的,又不太理解的问题,关于 stage1 中代码的注释网上一搜就有一大把。看了注释,再结合,我讲的这几点,应该能弄清 stage1 中是如何拷贝代码的了。接下来,我们来看看为什么 TEXT_BASE 的值是 0x33F80000 呢?

二、 TEXT_BASE=0x33F80000 的由来?

先看一个 SDRAM 的内存映射图:同样结合上面的 uboot.lds

0x33F80000

0x30000000

0x33ffffff

映射前

映射后

bss 段、 u-boot cmd 段、 .data 段 .rodata 段

及 .text 段及中断向量表

malloc 区域,见 start.S  sub r0,r0, #CFG_MALLOC_LEN

全局变量,见 start.S sub  r0, r0, #CFG_GBL_DATA_SIZE

IRQ:sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)

sub   sp, r0, #12

.

.

bss 段

u-boot cmd 段

.data 数据段

.rodata 只读数据段,

入口 20 字节中断向量表 .text(start.o 及 *(.text))

在 S3C2410 中,查看 datasheet , 64M SDRAM 地址空间即为 0x30000000 到 0x33ffffff ,在 bank6 中,而 flash 映射地址为 0x0 开始。

TEXT_BASE=0x33F80000 即为程序加载起始地址,可以使用的空间大小即为 0x33F80000 到 0x33FFFFFF 共 512K ,如果你 u-boot 包含的功能太多,觉得不够用,你可以把 0x33F80000 调小一点,即和往低地址移一些,移的过程中注意 memory page 对齐就行了,一般是 4KB.

转 U-BOOT之stage1的更多相关文章

  1. boot loader:grub入门[转]

    Boot Loader: Grub 在看完了前面的整个启动流程,以及核心模块的整理之后,你应该会发现到一件事情, 那就是『 boot loader 是加载核心的重要工具』啊!没有 boot loade ...

  2. 二十五、grub (Boot Loader) 以及修复grub

    双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader) GRUB Grand Uniform Bootloader CentOS5,6 grub ...

  3. Linux启动报错missing operating system

    用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...

  4. liunx 开机流程与模块管理

    系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub ...

  5. Linux学习笔记17--Linux系统启动详解

    多数操作系统的启动流程: BIOS启动自检 ->MBR引导->执行引导程序GRUB->加载内核->执行init->runlevel   BIOS(Basic Input ...

  6. LINUX命令总结 -------来自 水滴娃娃 的CSDN

    LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报  分类: linux(1)  版权声明:本文为博主原创文章,未经博主允许不得 ...

  7. grub paramiter & menu.list

    在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...

  8. GRUB学习笔记(转自http://www.cnblogs.com/evilzy/archive/2008/03/30/1130173.html)

    grub学习笔记1 首先要了解的几个概念 1.1 启动管理器 启动管理器是存储在磁盘开始扇区中的一段程序,例如,硬盘的MBR(Master Boot Record),在系统完成启动测试后,如果系统是从 ...

  9. Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题

    1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...

  10. uboot启动流程

    uboot 的启动过程及工作原理2.1 启动模式介绍    大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅 ...

随机推荐

  1. js instanceof 检测某个对象是否是另一个对象的实例

    例如File对象 $("#file").change(function(){ console.log($(this)[0].files[0]) console.log($(this ...

  2. hexo+github page +markdown问题汇总

    1.没有权限提交 解决办法:把git版本由2.x改为1.9 未完待续

  3. 2017-2018-2 20165328 实验三《敏捷开发与XP实践》实验报告

    一.实践-1: 要求:参考http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD安装alibaba插件,解决代码中的规范问题. 在ID ...

  4. SQLServer 常见高CPU利用率原因

    1.缺失索引: USE AdventureWorks2014 SET STATISTICS TIME ON; SET STATISTICS IO ON ; SELECT per.FirstName,p ...

  5. XAML绑定到资源文件字符串时失败

    参考:https://stackoverflow.com/questions/19586401/error-in-binding-resource-string-with-a-view-in-wpf ...

  6. dom操作节点之常用方法

    DOM:获取节点:{1. document.getElementById (元素id):通过元素id找到节点2. document.getElementsByClassName (元素类名classN ...

  7. MyEclipse和tomcat结合编写jsp对于中文乱码的解决方法

    一.Java和jsp 中文乱码原因和解决方法: Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦.原因有两方面: 第一方面:J ...

  8. C#学习-方法

    方法是由方法签名和一系列语句的代码块组成. 其中方法签名包括方法的访问级别(比如public或private).可修饰符(例如abstract关键字).方法名称和参数. C#也支持方法重载.方法重载指 ...

  9. (原创)C# 压缩解压那些事儿

    吐槽: 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗推广API的报告服务太坑爹了!!! 搜狗的太垃圾了,获取下来的压缩包使用正常方式无法解压!!没有专门的API ...

  10. MySQl 查询性能优化相关

    0. 1.参考 提升网站访问速度的 SQL 查询优化技巧 缓存一切数据,读取内存而不是硬盘IO 如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存.开启缓存意味着MySQL 会把所 ...