u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段

u-boot分析(十)

  上篇博文我们按照210的启动流程,分析到了初始化nand flash,由于接下来的关闭ABB比较简单所以跳过,所以我们今天按照u-boot的启动流程继续进行分析。

今天我们会用到的文档:

1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949

2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965

3.        210芯片手册:S5PV210_UM_REV1.1(我的不知道为什么传不上去大家去百度搜吧)

4.        Nand flash芯片手册:大家根据自己的nand flash芯片型号,找到对应的手册

今天我们会分析到以下内容:

1.      设置堆栈

2.      复制BL2到内存,并跳到内存执行代码

设置栈

1.       什么栈

相信学过数据结构的,都知道栈是一种先进后出的数据存储形式。

2.       基本概念

满栈:堆栈指针SP总是指向最后进栈的数据。(如下图)

空栈:SP总是指向下一个将要存放数据的空位置(如下图)

升栈:SP由低地址向高地址移动。(如下图)

降栈:SP由高地址向低地址移动。(如下图)

栈帧:每个进程程对应一个栈空间,进程中的函数会在该栈空间分配到一个属于自己的空间,该空间就是栈帧。栈帧有边界,上边界是FP(r11),下边界是SP(r13)。

注:arm采用的是满降栈

3.       如何初始化

栈的初始化比较简单,我们只要将SP指针指向内存中的某地址即可。在此就不过多分析

1 call_board_init_f:
2     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)
3     bic    sp, sp, #7 /* 8-byte alignment for ABI compliance */
4     ldr    r0,=0x00000000

复制BL2到内存,并跳到内存执行代码

因为我们初始化了栈,所以此时完全可以用C语言完成我们代码的拷贝,整个过程也是相当简单的,代码也没有任何难度,所以在此不再分析。

 1 void board_init_f_nand(unsigned long bootflag)
 2 {
 3         __attribute__((noreturn)) void (*uboot)(void);
 4         copy_uboot_to_ram_nand();
 5
 6         /* Jump to U-Boot image */
 7         uboot = (void *)CONFIG_SYS_TEXT_BASE;
 8     (*uboot)();
 9         /* Never returns Here */
10 }
 1 int copy_uboot_to_ram_nand (void)
 2 {
 3     int large_block = 0;
 4     int i;
 5     vu_char id;
 6
 7     NAND_CONTROL_ENABLE();
 8         NAND_ENABLE_CE();
 9         NFCMD_REG = NAND_CMD_READID;
10         NFADDR_REG =  0x00;
11
12     /* wait for a while */
13         for (i=0; i<200; i++);
14     id = NFDATA8_REG;
15     id = NFDATA8_REG;
16
17     if (id > 0x80)
18         large_block = 1;
19
20     /* read NAND Block.
21      * 128KB ->240KB because of U-Boot size increase. by scsuh
22      * So, read 0x3c000 bytes not 0x20000(128KB).
23      */
24     return nandll_read_blocks(CONFIG_SYS_TEXT_BASE, COPY_BL2_SIZE, large_block);
25 }
 1 static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block)
 2 {
 3         uchar *buf = (uchar *)dst_addr;
 4         int i;
 5     uint page_shift = 9;
 6
 7     if (large_block)
 8         page_shift = 11;
 9
10         /* Read pages */
11         for (i = (0x6000>>page_shift); i < (size>>page_shift); i++, buf+=(1<<page_shift)) {
12                 nandll_read_page(buf, i, large_block);//最终调用到了nand的页读
13         }
14
15         return 0;
16 }
时间: 2024-11-06 11:13:48

u-boot分析(十)----堆栈设置|代码拷贝|完成BL1阶段的相关文章

详细分析contrex-A9的汇编代码__switch_to(进程切换)

//函数原型:版本linux-3.0.8 struct task_struct *__switch_to(structtask_struct *, struct thread_info *, struct thread_info *); #define switch_to(prev,next,last)                                       \ do {                                                     

JVM:如何分析线程堆栈

英文原文:JVM: How to analyze Thread Dump 在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息. 我的目标是分享我过去十几年来在线程分析中积累的知识和经验.这些知识和经验是在各种版本的JVM以及各厂商的JVM供应商的深入分析中获得的,在这个过程中我也总结出大量的通用问题模板. 那么,准

性能分析十八招,你用哪一招?

对系统或程序进行相关性能分析,有助于分析研究运行时出现的问题或查找出问题根源.而没有方法论指导的分析,如盲头苍蝇,费时费力.本文将阐述进行性能分析采用的十八个方法论. 对系统或程序进行相关性能分析,有助于分析研究运行时出现的问题或查找出问题根源.而没有方法论指导的分析,如盲头苍蝇,费时费力.为确保软件满足或超过设计的期望值,有必要分析应用程序的性能以发现潜在的问题.性能分析一个必不可少的环节是使应用程序的组件可见.当能够了解组件是如何交互时,就可以诊断潜在的性能问题. 主要采用的方法论,包括:U

谷歌为什么把上十亿行代码都放在一个仓库里

相对于一般公司,Google 使用了单一代码仓库,很多人不理解为什么这么做.本文作者是谷歌基础设施小组的工程师,他对这个问题进行了详细解读. 早期 Google 员工决定使用集中式源代码管理系统来管理代码库.这种方法已经在 Google 运行了 16 年以上,而今天绝大多数的 Google 软件仍然存储在一个共享的代码库中. 随着 Google 开发软件数量稳步增加,Google 代码库的规模也呈指数增长. 因此,用于管理代码库的技术也发生了显著变化. 本文概述了该代码库的规模,并详细介绍了 G

20190902 On Java8 第十六章 代码校验

第十六章 代码校验 你永远不能保证你的代码是正确的,你只能证明它是错的. 测试 测试覆盖率的幻觉 测试覆盖率,同样也称为代码覆盖率,度量代码的测试百分比.百分比越高,测试的覆盖率越大. 当分析一个未知的代码库时,测试覆盖率作为一个粗略的度量是有用的.如果覆盖率工具报告的值特别低(比如,少于百分之40),则说明覆盖不够充分.然而,一个非常高的值也同样值得怀疑,这表明对编程领域了解不足的人迫使团队做出了武断的决定.覆盖工具的最佳用途是发现代码库中未测试的部分.但是,不要依赖覆盖率来得到测试质量的任何

JS实现十分钟倒计时代码实例

编写JS倒计时代码需要用到很多JavaScript知识,比如:if函数,Math.floor,定时器setInterval等等,如有不清楚的小伙伴可以参考PHP中文网的相关文章,或者访问 JavaScript视频教程. 举例:10分钟考试倒计时,当时间仅剩五分钟时,提醒考试仅剩5分钟,时间结束时,提示考试结束.具体代码如下: HTML部分: ? 1 2 3 4 <body>  <div id="timer"></div>  <div id=&q

WCSTOMBS 函数不支持中文件的解决方法(设置代码页)

代码页没有进行设置.需要调用locale.h 中定义的一个函数设置默认的代码页 _tsetlocale(LC_ALL,_T(""));//设置代码页  wcstombs(sendBuf,strSendData,sendLen); setlocale(LC_ALL,"C"); http://blog.csdn.net/liutiaoer/article/details/5790104

Eclipse的模板设置代码

Eclipse Java注释模板设置详解 设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素啦.现就每一个元素逐一介绍: 文件(Files)注释标签: /**   * @Title: ${file_name} * @Package ${package_name} * @Description: ${todo}(用一句话描述该文件做什么) * @author

android studio 如何设置代码提示

图上内容比较多,我直接按区域划分成6块区域来说吧: 区域1:这个选项是关于提示的时候如何进行匹配,即按照什么条件来进行提示内容的搜索. All:选择这个的话,意思就是要和你输入的字符进行全匹配,能全匹配起来的字符才会显示在提示列表中,如下图,其实就相当于精确搜索: None:选择这项的话,意思是进行模糊匹配,我直接上图吧,大家看图就明白了: First Letter:即是根据首字母进行匹配,不过这里面感觉还是有bug,选择First Letter时,匹配的结果和all类似,又比all少.这块个人