转 U-BOOT之stage1
前言
本文主要是基于大家比较熟悉的 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的更多相关文章
- boot loader:grub入门[转]
Boot Loader: Grub 在看完了前面的整个启动流程,以及核心模块的整理之后,你应该会发现到一件事情, 那就是『 boot loader 是加载核心的重要工具』啊!没有 boot loade ...
- 二十五、grub (Boot Loader) 以及修复grub
双系统安装(先Windows后Linux,以免windows NTloader会覆盖Linux loader) GRUB Grand Uniform Bootloader CentOS5,6 grub ...
- Linux启动报错missing operating system
用UltraISO制作了一个Red Hat Enterprise Linux Server release 5.7系统的U盘启动盘,然后在一台PC上安装,由于安装过程中在干别的事情,有些选项没有细看. ...
- liunx 开机流程与模块管理
系统开机的经过可以汇整成底下的流程的: 加载 BIOS 的硬件信息与进行自我测试,并依据设定取得第一个可开机的装置: 读取并执行第一个开机装置内 MBR 的 boot Loader (亦即是 grub ...
- Linux学习笔记17--Linux系统启动详解
多数操作系统的启动流程: BIOS启动自检 ->MBR引导->执行引导程序GRUB->加载内核->执行init->runlevel BIOS(Basic Input ...
- LINUX命令总结 -------来自 水滴娃娃 的CSDN
LINUX命令总结 标签: LINUX命令总结 2014-01-27 15:54 41039人阅读 评论(1) 收藏 举报 分类: linux(1) 版权声明:本文为博主原创文章,未经博主允许不得 ...
- grub paramiter & menu.list
在Linux中,给kernel传递参数以控制其行为总共有三种方法: 1.build kernel之时的各个configuration选项. 2.当kernel启动之时,可以参数在kernel被GRUB ...
- GRUB学习笔记(转自http://www.cnblogs.com/evilzy/archive/2008/03/30/1130173.html)
grub学习笔记1 首先要了解的几个概念 1.1 启动管理器 启动管理器是存储在磁盘开始扇区中的一段程序,例如,硬盘的MBR(Master Boot Record),在系统完成启动测试后,如果系统是从 ...
- Win7下安装双系统Centos,并修复Centos引导加载程序安装在U盘上的问题
1.使用U盘安装Centos时,磁盘分区划分要注意:系统(包含Win7)只能4个主分区,所以只能在删除一个主分区或者在扩展分区的空闲分区内建立目录. 2.Centos在安装步骤的最后,引导加载程序的选 ...
- uboot启动流程
uboot 的启动过程及工作原理2.1 启动模式介绍 大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅 ...
随机推荐
- Exchange Server Notes
以下信息来自Option响应: HTTP/1.1 200 OK Cache-Control: private Allow: OPTIONS,POST Server: Microsoft-IIS/7.0 ...
- Nancy 寄宿IIS
一:简介 Nancy是一个轻量级的独立的框架,下面是官网的一些介绍: Nancy 是一个轻量级用于构建基于 HTTP 的 Web 服务,基于 .NET 和 Mono 平台,框架的目标是保持尽可能多的方 ...
- WCF+Autofac 实现构造函数依赖注入
1.新建一个项目 2.要对WCF服务实现Autofac注入,需要实现2个接口,IInstanceProvider与IServiceBehavior,并让实现IServiceBehavior的类成为一个 ...
- asp.net core 2.0 webapi集成signalr
asp.net core 2.0 webapi集成signalr 在博客园也很多年了,一直未曾分享过什么东西,也没有写过博客,但自己也是汲取着博客园的知识成长的: 这两天想着不能这么无私,最近.N ...
- Python_列表常用操作
%d 数字 %f 浮点 %s 字符串 字符串常用功能: .strip() 默认去掉字符串两边空格#或者在括号里注明去除什么 查看列表方法:dir(列表名) .append(元素): ...
- JMeter性能测试,验证请求数据的准确性(wc命令)
wc: 该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取. wc同时也给出所有指定文件的总统计数.字是由空格字符区分开的最大字符串. - c 统计字节数. - l 统计行 ...
- net core体系-web应用程序-1VS2017构建一个简单的web
使用vs2017,添加一个新项目-asp.net core web应用程序. 结构如图, wwwroot放了网站的静态资源如css.js.image文件: appsetting.json是应用程序的配 ...
- Codeforces 986C AND Graph dfs
原文链接https://www.cnblogs.com/zhouzhendong/p/9161514.html 题目传送门 - Codeforces 986C 题意 给定 $n,m (0\leq n\ ...
- linux中通过lsof恢复删除的文件,前题是fd被占用。
http://www.serverwatch.com/tutorials/article.php/3822816/Recovering-Deleted-Files-With-lsof.htm One ...
- Python交互图表可视化Bokeh:4. 折线图| 面积图
折线图与面积图 ① 单线图.多线图② 面积图.堆叠面积图 1. 折线图--单线图 import numpy as np import pandas as pd import matplotlib.py ...