通过上两篇博客终于把从NAND复制源码到RAM的c语言写的部分说完了,现在回到start.s中,接着分析余下的代码。

-----------------------------------------------------------------------------------------------------------------

/*
 * copy U-Boot to SDRAM and jump to ram (from NAND or OneNAND)
 * r0: size to be compared
 * Load 1'st 2blocks to RAM because U-boot's size is larger than 1block(128k) size
 */
.globl copy_from_nand
copy_from_nand:
mov r10, lr/* save return address */

mov r9, r0
/* get ready to call C functions */
ldr sp, _TEXT_PHY_BASE/* setup temp stack pointer */
sub sp, sp, #12
mov fp, #0/* no previous frame, so fp=0 */
mov r9, #0x1000
blcopy_uboot_to_ram  上一篇,我们分析到了这里。

-------------------------------------------------------------------------------------------------------

3: tst r0, #0x0   根据下面的用法,这句汇编就没有任何用处了,根本就达不到检测目的。
bne copy_failed

从上一篇的分析可以知道,copy_uboot_to_ram的返回值是0,即如果成功的话r0应该是0.这里就是进行判断,但我有一点不明的地方,我查了下tst指令,用法入下所示:

-------------------------------------------------------------------------------------------------------------

TST  测试指令
TST(Test)测试指令用于将一个寄存器的值和一个算术值进行比较,条件标志位
根据两个操作数做逻辑与后的结果设置。
1)指令的语法格式
TST{<cond>} <Rn>,<shifter_operand>
2)TST指令举例
TST 指令类似于CMP 指令,不产生放置到目的寄存器中的结果,而是在给出的两个操作数上进行操作并把结果反映到状态标志上。使用TST指令检查是否设置了特定的位。操作数1 是要测试的数据字,而操作数2是一个位掩码。经过测试后,如果匹配则设置Zero标志,否则清除它。与CMP指令一样,该指令不需要指定S后缀。
例子:
TST R0, #%1测试在R0 中是否设置了位0。

TST R1,#0x0F ;判断R1 的低4 位是否为0

TST 指令通常与EQ,NE条件码配合使用,当所有测试位均为0 时,EQ 有效,而只要有一个测试为不为0,则NE 有效.

------------------------------------------------------------------------------------------------------------

ldr r0, =0x0c000000
ldr r1, _TEXT_PHY_BASE

上面有定义:

_TEXT_PHY_BASE:
.word CFG_PHY_UBOOT_BASE

CFG_PHY_UBOOT_BASE为0x57e00000

1: ldr  r3, [r0], #4  
ldr r4, [r1], #4

--------------------------------------------------

可是这里的r0为什么是0x0c000000呢?这要从s3c6410的启动方式说起,当从NAND启动时,当从NAND启动时,会复制uboot源码前4K到内部RAM,内部SRAM 的地址范围是0x0C00_0000~0x0FFF_FFFF,但是实际存储仅4KB。该区域能被读和写,当NAND 闪存启动被选择时能映射。

------------------------------------------------------------------

LDR Rd,[Rn],#0x04 ; Rn的值用做传输数据的存储地址。在数据传送后,将偏移量0x04 与Rn相加,结果写回到Rn中。Rn不允许是R15

-----------------------------------------------------------------
teq r3, r4
bne compare_failed/* not matched */
subs r9, r9, #4    这里movr9, #0x1000这个是在上面被赋值的,即r9=4K,即这里要比较前4K的代码
bne 1b

4: mov  lr, r10 /* all is OK */
movpc, lr     成功就可以返回了

copy_failed:
nop /* copy from nand failed */
b copy_failed

compare_failed:
nop /* compare failed */
b compare_failed

到这里我们终于把从NAND赋值代码到RAM中的源码分析完了,从这里应该对从NAND启动,有了更加清晰的理解,而不再像以前那样,只是从理论上知道。

------------------------------------------------------------------------------------------------------------

三星uboot1.1.6源码分析——start.s(4)——从NAND复制源码到RAM(3)相关推荐

  1. 【源码分析】storm拓扑运行全流程源码分析

    [源码分析]storm拓扑运行全流程源码分析 @(STORM)[storm] 源码分析storm拓扑运行全流程源码分析 一拓扑提交流程 一stormpy 1storm jar 2def jar 3ex ...

  2. Android框架源码分析——从设计模式角度看 Retrofit 核心源码

    Android框架源码分析--从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式:代理模式.外观模式.构建者模式等.我们将从这三种设计模式入手,分析 Retrof ...

  3. 【SA8295P 源码分析】18 - Camera Bringup 流程 及 源码分析

    [SA8295P 源码分析]18 - Camera Bringup 流程 及 源码分析 一.Camera Bringup 流程 1.1 CameraConfigSA8295.c 配置文件解析 1.2 ...

  4. ceph bluestore 源码分析:ceph-osd内存查看方式及控制源码分析

    文章目录 内存查看 内存控制 内存控制源码分析 通过gperftools接口获取osd进程实际内存 动态设置cache大小 动态调整cache比例 trim释放内存 本文通过对ceph-osd内存查看 ...

  5. 【源码分析】极验验证官方SDK源码分析和实现思路

    前言 2016年就这么来了,新的一年,继续努力~ 最近,除了12306的验证码火起来以后,还有一个在界面上拖拽的验证码,也火了起来,就是这次要说的极验验证,在这个万众创新的时代,工具类产品能做到这样, ...

  6. 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )

    文章目录 一.目前的 API 现状 二.安装应用源码分析 1.安装按钮执行的操作 2.返回到 HomeActivity 执行的操作 一.目前的 API 现状 下图是 VirtualApp 官方给出的集 ...

  7. Anbox源码分析(四)——Anbox渲染原理(源码分析)

    Anbox源码分析(四) 上篇文章我们从源码分析了一下Anbox是怎样一步步的准备了OpenGL ES的渲染环境的,这篇文章,我们继续分析Android的渲染指令是如何到达宿主机进行渲染的. 宿主机端 ...

  8. Anbox源码分析(三)——Anbox渲染原理(源码分析)

    Anbox源码分析(三) 上一篇,我们介绍了Anbox视频渲染的原理,这一篇,我们从源码入手,更深入的理解Anbox与渲染的机制和原理 session manager入口 session manage ...

  9. android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置

    本文主要介绍了Android编程的Android GPS --AGPS源码分析及配置,通过具体的分析以及源码,向大家展示了这些,希望对大家学习Android编程有所帮助. 1:冷启动指令: locat ...

最新文章

  1. Flat - Music scores and guitar tabs editor(乐谱编辑器)
  2. 从零开始学习hadoop之发行版选择
  3. 自定义SpringBoot项目的Maven原型
  4. java输入日期计算天数_(JAVA)输入年月日,计算日期是今年的第几天?
  5. 弹性盒子内容体居右对其_弹性盒子侧轴对齐方式
  6. 面向对象分析的三个模型与5个层次
  7. 为什么python除法结果会有小数点0_关于python:为什么整数除法会在许多脚本语言中向下取整?...
  8. JavaScript数据类型之Undefined、Null、Boolean
  9. 【图像压缩】基于matlab行程编码(RLE)图像压缩【含Matlab源码 404期】
  10. SAI2.0绘画软件中文版(已测可用)
  11. linux 检验md5命令,linux命令行校验工具md5sum
  12. Ubuntu 下使用为知笔记(WizNote)Linux 客户端
  13. 5G网络能力开放的“接头人“——NEF
  14. iptable 帮助
  15. 对于上海交通大学网络安全专业21考研823的一些总结以及22考研专业课如何准备的想法
  16. python谁的教程好贴吧_python深挖65万人的明星贴吧,探究上万个帖子的秘密
  17. eclipse osgi_Eclipse通过提议的OSGi容器Kura支持M2M产品组合
  18. 闽侯一中2021年高考成绩查询,2021年福州高考各高中成绩及本科升学率数据排名及分析...
  19. Git 核心概念:工作区与暂缓区(添加提交及查看状态充分体现)
  20. debouncing 与 throttling

热门文章

  1. python cannot import name main_virtualenv: cannot import name 'main'
  2. 解决sklearn.metrics指标报错ValueError: Target is multiclass but average=‘binary‘. Please choose anothe...
  3. scrapy 整合 djangoitem,摆脱保存数据时SQL报错的困扰
  4. Android开发工具Android Studio、Android SDK和Genymotion完全配置
  5. Visual Studio Code 使用指南
  6. ES6 中的 Set、Map 和 WeakMap
  7. Javascript—③对象
  8. 11-6渐变的用途和设定技巧
  9. Windows命令行(DOS命令)教程
  10. Ext 组件的一些操作