一篇鸡肋似得,关于u-boot中 _start 和 _armboot_start关系的帖子

U-boot源码阅读-使用u-boot.map定位函数位置 在阅读U-boot源码时,同一个函数会有多个定义,这不利于快速理解U-boot。如何唯一定位函数的位置呢? 原理 在我们配置、编译U-boot后,gcc将生成一个map文件。在map文件中,包含函数名以及函数所在文件。我们可以通过通过这个map文件,快速定位我们想要分析函数的位置。为方便手动查找,编写一个脚本,以函数名为参数,输出定义函数的文件和行号,并用vim打开。 脚本名"s", 内容:... 阅读详情

以下内容来自笔者在中国Linux论坛Linux嵌 入技术讨论区的张贴:


aaronwong: u-boot中代码的疑问(_armboot_start与_start)? 
---------------------------
我 使用的是u-boot-1.3.0-rc2。在cpu/pxa/start.S中,有如下的标号定义: 
_TEXT_BASE: 
.word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我 设置为0xa170 0000 */ 

.globl _armboot_start 
_armboot_start: 
.word _start /*_start是程序入口,链接完 毕它的值应该是0xa170 0000=TEXT_BASE*/ 
/* 这句话的意思应该是在_armboot_start标号处,保存了_start的值,也就是说,_armboot_start是存放_start的地址, 该地址对应的存储单元内容是0xa170 0000*/ 
/* 
* These are defined in the board-specific linker script. 下面的定义与上面应该是一个意思。 
*/ 
.globl _bss_start 
_bss_start: 
.word __bss_start 
====================== 
按照上面的理解,__bss_start是uboot 的bss段起始地址,那么uboot映像的大小就是__bss_start - _start;在relocate代码段中计算uboot的大小时,也体现了这一点。 
实际上,_armboot_start并没有实际意义,它 只是在"ldr r2, _armboot_start"中用來寻址_start的值而已,_bss_start也是一样的道理,真正有意义的应该是_start和 __bss_start本身。 
但是,令我不解的是,在C入口函数start_armboot()中(对应文件为 lib_arm/board.c),有如下代码: 
void start_armboot (void) 
{ 
......... 
gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); //第一句话 
.......... 
monitor_flash_len = _bss_start - _armboot_start; //第 二句话 
............... 
mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); //第三句话 
.......... 
} 
============================================== 
按照上面的理 解,_armboot_start与_bss_start都是没有实际意义的,它们只是一个地址,有实际意义的是地址中的内容_start和 __bss_start(虽然也还是地址)。象第一句话,其“意图”很明显,是把gd作为全局数据结构体的指针,并初始化为“SDRAM中的uboot起 始地址(即TEXT_BASE)-CFG_MALLOC_LEN-全局数据结构体大小”。 
要实现这个“意图”,应该是写成:gd = (gd_t*)(_start - CFG_MALLOC_LEN - sizeof(gd_t));或者gd = (gd_t*)(TEXT_BASE- CFG_MALLOC_LEN - sizeof(gd_t));才对阿?用_armboot_start来作运算应该是没有任何意义才对!? 
第二句话也是一样的道理,它的意图是 要计算u-boot映像的大小,应该写成__bss_start - _start才对阿? 
我使用readelf工具查看编译所得到的 uboot映像文件得到信息如下: 
[aaronwong@localhost build]$ readelf -s u-boot|grep _start 
1018: a1700048 0 NOTYPE GLOBAL DEFAULT 1 _bss_start 
1083: a1700044 0 NOTYPE GLOBAL DEFAULT 1 _armboot_start 
1142: a1700000 0 NOTYPE GLOBAL DEFAULT 1 _start 
1197: a171b070 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 
上面我删除了与该讨论无关的包含“_start""t的标号信息。 
显然,我前面的理 解应该是正确的(_start=TEXT_BASE=0xa170 0000)。那么u-boot源代码中的monitor_flash_len=_bss_start - _armboot_start=0xa1700048 - 0xa1700044 = 4,有什么意义?? 
迷茫中,期盼大虾指点迷津,谢 谢~!!!


eltshan: [Re: aaronwong] 
-----------------
1018: a1700048 0 NOTYPE GLOBAL DEFAULT 1 _bss_start 
1083: a1700044 0 NOTYPE GLOBAL DEFAULT 1 _armboot_start 
1142: a1700000 0 NOTYPE GLOBAL DEFAULT 1 _start 
1197: a171b070 0 NOTYPE GLOBAL DEFAULT ABS __bss_start 

我想: 
_start 所在的地址是a1700000, 
_armboot_start 所在的地址是a1700044, 
那么 根据这句: 
_armboot_start: .word _start 
所以_armboot_start的值应该是a1700000 

所以 
monitor_flash_len = _bss_start - _armboot_start = a171b070 - a1700000 = 1b070 
而不是你说的 = 4 

以上个人意见.


aaronwong: [Re: eltshan] 
-------------------
谢谢,eltshan!你的理解是正确的,不过我看 了之后还是没能想得很明白,因为我在想,按你所说,那么_start的值应该是多少呢?难道是“b reset”这条指令的机器码?所以我对ELF格式的u-boot映像文件作了反汇编,分析之后终于找到了症结所在。以下是部分分析过程,首先是反汇编: 
arm-iwmmxt-linux-gnueabi-objectdump -D u-boot > u-boot.s 
并提取 了monitor_flash_len = _bss_start - _armboot_start;这条语句相关的反汇编代码如下: 
============================== 
a1700044 <_armboot_start>: 
a1700044: a1700000 .word 0xa1700000 

a1700048 <_bss_start>: 
a1700048: a171b070 .word 0xa171b070 

a171b070 <monitor_flash_len>: 
a171b070: 00000000 .word 0x00000000 

..... 
a1700f40: e59f41d0 ldr r4, [pc, #464] ; a1701118 <start_armboot+0x1dc> 
//r4=[a1701118]=a1700044 
..... 
a1700f7c: e59f3198 ldr r3, [pc, #408] ; a170111c <start_armboot+0x1e0> 
//r3=[a1700044]=a1700048 
a1700f80: e5942000 ldr r2, [r4] 
//r2=[a1700044]=a1700000 
a1700f84: e59f4194 ldr r4, [pc, #404] ; a1701120 <start_armboot+0x1e4> 
//r4=[a1701120]=a1719d24 
a1700f88: e5933000 ldr r3, [r3] 
//r3=[a1700048]=a171b070 
a1700f8c: e0623003 rsb r3, r2, r3 
//r3= r3-r2 = a171b070-a1700000 = 1b070; 
a1700f90: e59f218c ldr r2, [pc, #396] ; a1701124 <start_armboot+0x1e8> 
//r2=[a1701124]=a171b070 
a1700f94: e5823000 str r3, [r2] 
//monitor_flash_len=[r2]=r3=1b070 
...... 

a1701118: a1700044 .word 0xa1700044 
a170111c: a1700048 .word 0xa1700048 
a1701120: a1719d24 .word 0xa1719d24 
a1701124: a171b070 .word 0xa171b070 
======================================== 
上 面//是我自己的注释。这表明,你的理解的确是正确的。 
经过这个过程之后,我终于认识到自己的误解在哪里了。原来,我是把"汇编语言中LDR伪 指令对符号的引用"与"C语言中对汇编程序中符号/常量/变量的引用"搞混淆了。我想说明以下几点:

(1) readelf以及u-boot.map和System.map所给出的符号表中符号的值,实际上是表示符号所在的地址,而不是指符号本身的值。 

(2) 汇编语言中没有指针的概念,因此对符号的引用是"赤裸裸"的。 例如: 
========== 
.globl _armboot_start 
_armboot_start: .word _start 
ldr r2, _armboot_start 
========== 
实际上反汇编以后是: 
============ 
a1700044 <_armboot_start>: 
a1700044: a1700000 .word 0xa1700000 
a1700074: e51f2038 ldr r2, [pc, #-56] ; a1700044 <_armboot_start> 
============ 
也就是说,_armboot_start是一个地址0xa1700044,其中的内容是0xa1700000,上面对 _armboot_start的引用是直接将其替换为其表示的地址0xa1700044,而非其中的内容0xa1700000。这就是"赤裸裸"的引用。 

(3) C语言则不同,对变量/符号/常量的引用必须要通过地址来寻址,不管是全局变量还是局部变量,不同的是局部变量在生命期结束后,所占的地址空间会被释放而 已。即使是函数调用时的参数传递,虽然是将实参的值"拷贝"给形参,但"拷贝"的过程也是通过实参和形参的地址来对两者进行访问的。 
所 以,在C语言中的 "monitor_flash_len = _bss_start - _armboot_start" 这句话中对_armboot_star的引用,实际上是把它用作了指针,把它作为访问对象的地址来使用,通过这个地址即a1700044 来访问对应存储空间所存放的内容亦即0xa1700000,_bss_start也是同样的道理。所以这句话实际上是monitor_flash_len =[a1700048]-[0xa1700044]=a171b070-a1700000 = 1b070,这样就得到了正确的结果。 

现 在,我们再回答最前面的问题:_start的值是什么? _start 表示地址0xa1700000 ,在汇编语言中,对_start的"绝对引用"(这里是与用相对寻址进行跳转进行区别)就是将其替换为0xa1700000,但其中存放的内容的的确确就 是"b reset"这条指令的机器码,所以如果在C语言中引用_start,得到的结果反而就是这个指令的机器码了。其实这个问题很简单,只是和C语言的引用搅 在一起,一些概念被偷换了而已。 

以上是我的个人理解,有什么不对,还请指正。 

再次感谢eltshan的提点。

 

 

 

 

楼主,你还是没有完全理解对,在(2)



========== 



.globl _armboot_start 



_armboot_start: .word _start 



ldr r2, _armboot_start 



========== 



实际上反汇编以后是: 



============ 



a1700044 <_armboot_start>: 



a1700044: a1700000 .word 0xa1700000 



a1700074: e51f2038 ldr r2, [pc, #-56] ; a1700044 <_armboot_start> 



============ 



_armboot_start是一个地址0xa1700044,它的值为0xa1700000,上面这句不是你理解的对_armboot_start的引用是直接将其替换为其表示的地址0xa170044,应该是从地址为0xa1700044的地方把值(0xa1700000)读入。不要被GNU反汇编出来的注释麻痹了,呵呵,它是帮你指明pc,#-56指向了哪个地址。



这个道理跟你自己前面作的注释一样,你看看你自己注释的那句:



//r4=[a1701118]=a1700044



它前面那条语句最后的反汇编注释。呵呵,你前面都明白了,为什么最后还要糊涂?



ldr r0, _start   ;从内存地址_start的地方把值读入r0,与位置无关,对于_start这个符号表示的地址是通过相对pc的位移来实现,但ldr的结果是读值。



ldr r0,=_start  ;这个是伪指令,读取_start的绝对地址到r0。这个跟位置有关,编译后一般是通过把表示_start地址的值存入一个位置(地址),然后再通过对这个位置的与位置无关的ldr来实现对_start地址的读取。不管程序在哪里执行,读取的值一定是一样的。



还有一个adr r0, _start的伪指令,是通过add来实现的相对pc的位移读取_start的地址到r0,与位置就无关了。





总的来说,在c代码中如果应用第一阶段汇编代码中定义的符号,变量或常量时实际上是引用的该符号处存放的内容,而不是该符号的地址。所以对于在start_armboot函数中出现的:


gd = (gd_t*)(_armboot_start - CFG_MALLOC_LEN - sizeof(gd_t)); 

monitor_flash_len = _bss_start - _armboot_start; 




mem_malloc_init (_armboot_start - CFG_MALLOC_LEN); 

里面的_armboot_start和_bss_start符号就不难理解拉,在C函数中这些符号代表着他们里面存放着的内容也就是_start和__bss_start值,而不是这两者的绝对地址拉。



而在汇编代码中对于符号的运用也有两种情况:

对于

.globl _armboot_start 

_armboot_start: .word _start 

ldr r2, _armboot_start //对于这种形式的ldr指令,我们可以看到反汇编出来的代码,实际上就是将_armboot_start存放的内容取出来赋值给r2



而对于

ldr r2,=_armboot_start//对于这种形式的ldr 指令,将_armboot_start的实际绝对地址赋值给r2





其实上面两种说发,表示的是一个意思,只不过深入的程度不同,第一种说法中提到的在汇编代码中对符号赤裸裸的引用,意思是直接将符号的绝对地址拿出来去取值,也就是反汇编后括号[ ]里面存放的直接地址,而第二种说话,只不过就是将从这种地址取到的值赋值出来。
【R】R画图不显示中文问题 系统mac os 11 RstutioVersion1.2.1335 RVersion3.6.2 画图里的中文一直显示成方框。 ggplot()+geom_point(aes(x=ta1$X2011年,y=ta1$X2012))+ xlab("2011年")+ylab("2021年") 解决方案: 使用showtext。 install.packages("showtext", repos = "https://mirrors.ustc.edu.cn/CRAN/") in... 阅读详情

相关推荐

基于TL431与光耦的电压反馈环路优化设计实战

本文深入探讨了基于TL431与光耦的电压反馈环路优化设计实战。文章从理解这对“黄金搭档”的工作原理入手,详细拆解了电压采样电阻网络、偏置电路、光耦工作点设置以及动态补偿网络的设计心法与计算步骤。重点分享了如何通过RC补偿网络调试,确保环路在各种负载下稳定可靠,并提供了关键的实战避坑指南,帮助工程师解决电源设计中常见的振荡、噪声及可靠性问题。

nginx7reverse的博客 777

uboot启动流程——C阶段的start_armboot函数

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 2026

MATLAB出现”警告: 名称不存在或不是目录“的解决方案

MATLAB出现 警告: 名称不存在或不是目录 的解决方案1. 出现错误2. 问题解释3. 解决方法4. 特殊情况5. 问题解决6. 多多点赞交流 1. 出现错误 打开MATLAB突然发现,出现下面的错误: 提示我们不存在这样的路径。 2. 问题解释 这样的错误很明显,我们曾经在预设路径中添加了这个文件夹。 在某种情况下,我们把它删除了,现在MATLAB找不到它了。 (这里我在桌面上添加了新建文件夹,然后将其添加到MATLAB的搜索路径中。之后把新建文件夹删除了,所以就会出现这样的报错) 3. 解决方法

qq_18820125的博客 5万+

uboot启动第二阶段——C语言

给全局变量gd分配内存 详情参考:《uboot中重要的全局变量——gd》。

weixin_42031299的博客 1479

以太网以及车载以太网概述

千兆网线和百兆网线区别 1、所谓的百兆网线其实就是 五类线 和超五类线 ,而千兆网线主要是指六类线 和超六类线 ,另外还有古老的十兆网线也就是指 四类线 和 三类线 等。 2、在使用上,其实千兆网线和百兆网线是没什么区别的,千兆网线完全兼容百兆网络。 3、百兆网线的线芯是8芯,但上传和下载只用到了其中的4根,而千兆网线需要完全用到8根。 4、另外在线芯的排布上,千兆网线的线芯中间有个十字形的塑料架,用来把四组8芯的线分开,这个百兆网线是没有的, 5、所有的网线在外皮上都有种类标识,CAT5 CAT

$好记性还是要多记录$ 4074

redhawk:Low Power Analysis

1.rush current与switch cell 在standby状态下为了控制leakage power我们选择power gating的设计方式,使用power switch cell关闭block/power domain的电源。 power switch的基本介绍可见: 低功耗设计-Power Switch power switch的table中有四种状态,对应block工作、待机和上电,下电。low power analysis主要分析上电的过程。 上电过程可以看做mos电容

m0_61544122的博客 3203

海思(Hi3521a)uboot详细分析(6)——uboot启动第二阶段start_armboot函数分析

uboot 在start.S中完成了第一阶段启动后,由汇编语言调用C语言函数start_armboot进入第二阶段的启动,在海思给的Uboot代码中,该函数定义在/u-boot-2010.06/arch/arm/lib/board.c。它主要完成了: 全局变量的初始化 初始化硬件及软件数据结构 初始化uboot堆管理器 flash驱动初始化 环境变量重定向 输入输出初始化 其..................

Biao 3209

【WRF工具】WRF 模型输出可视化工具 RIP4

【WRF工具】WRF 模型输出可视化工具 RIP4

WW、forever的博客 1594

U-Boot系列之四: start_armboot()函数分析

在上一篇文章中,我们介绍了u-boot启动的时候汇编语言的部分,当时我们进行了一些简单的初始化,并且为C语言的执行建立的环境(堆栈),现在我们看 看当从汇编语言转到C语言的时候执行的第一个函数( start_armboot (),在lib_arm/board.c中),该函数进行了一系列的外设初始化,然后调用main_loop (),根据配置来选择是直接加载Linux内核还是进入等待命令模式。     在介绍该函数之前,我们需要看一看几个数据结构,这些是u-boot中几个重要的数据结构: 1

liangkaiming的专栏 3289

RT-DETR算法优化改进:Backbone改进 | HGBlock完美结合PPHGNetV2 GhostConv

GhostConv助力RT-DETR ,HGBlock与PPHGNetV2 GhostConv完美结合

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2909

在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch

文章目录在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch结论参考资料解释相关命令版本关系版本选择总结:实验 在anaconda环境中使用conda命令安装cuda、cudnn、tensorflow(-gpu)、pytorch 结论 使用conda虚拟环境 使用conda命令安装 最重要的是版本关系(python、cuda、cudnn、pytor或者tensorflow框架)的对应。 参考资料 tensorflow2.x安装 理清GPU、

纸上得来终觉浅,绝知此事要躬行! 3万+

uboot之start_armboot分析1

uboot的第二阶段就是要初始化剩下的还没被初始化的硬件。主要是SoC外部硬件(譬如iNand、网卡芯片····)

积跬步,以致远 1153

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

uboot启动流程——汇编阶段的start.S文件(平台相关的)与lowlevel_init.S文件(开发板相关的)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

主要记录嵌入式学习与开发过程。 3026

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从U-Boot源码看C语言对汇编代码中的符号引用

以下内容来自笔者在中国Linux论坛Linux嵌 入技术讨论区的张贴: aaronwong: u-boot中代码的疑问(_armboot_start与_start)?  --------------------------- 我 使用的是u-boot-1.3.0-rc2。在cpu/pxa/start.S中,有如下的标号定义:  _TEXT_BASE:  .word TEXT_BA

张亮校的专栏 1157

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

从零开始的UBOOT的学习6--start_armboot

从零开始的UBOOT的学习6--start_armboot参考朱有鹏UBOOT全集1、start_armboot函数简介(1)这个函数的是在UBOOT/lib_arm/board.c的第444行开始到908行结束(2)450行里面还不是全部的函数,因为里面调用了很多函数。(3)此函数构成了UBOOT启动部分的第二阶段。(4)宏观分析:UBOOT的第二阶段应该做什么?4.1、概括来讲UBOOT的第一...

李辉的博客 929

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

u-boot之start_armboot函数分析

在分析start.S文件过程中提到过,最后从汇编跳到C函数执行的是start_armboot函数,位于lib_arm\board.c文件下,它的执行流程图如下,截图来源于《嵌入式LINUX应用开发完全手册》。根据流程图,以下内容大致分几步写: 1、gd全局变量初始化 2、调用init_sequence函数指针数组里的初始化函数、nand初始化、环境变量初始化、USB初始化 3、死循环main...

weixin_30386713的博客 215

U-boot(四):start_armboot

dm9000_pre_init函数为网卡初始化(GPIO和端口配置非驱动),gd->bd->bi_arch_number定义机器码,gd->bd->bi_boot_params为内核启动传递参数内存地址(0x30000100)dram_init在一阶段初始化low_level_init中初始化,此处为给全局变量定义赋值,记录DDR配置(gd->bd->bi_dram)gd_t中定义全局变量,其中bd_t结构体包含硬件参数(波特率,IP,mac,机器码,启动参数,环境变量,DDR,网卡)

tyro_wzp的博客 1685

uboot————第二阶段start_armboot 函数详解

1:上一节讲到start.S中进行了一系列的SoC相关硬件初始化以后进行了长跳转到start_armboot 函数中; start_armboot进一步初始化board中硬件,并设置了uboot下的命令行、环境变量、基本命令、跳转到kernel 下面详细介绍start_armboot中的代码: ------------------------第一段代码--------------------...

weixin_30477293的博客 313

U-Boot源码之函数start_armboot

U-Boot启动执行完start.s文件里的reset部分代码后,程序将跳转至函数start_armboot。函数start_armboot位于lib_arm/board.c文件中。函数start_armboot是U-Boot启动的第二个阶段,它将完成U-Boot启动的所有工作并最终进入main循环。 ...

Enjoy working的博客 402

7.uboot第二阶段 start_armboot函数代码分析

这个函数整个构成了uboot启动的第二阶段。(1)都是板级硬件的初始化以及gd、gd->bd中的数据结构的初始化。譬如:cpu_init:空board_init:网卡初始化、机器码(gd->bd->bi_arch_number)、内核传参DDR地址(gd->bd->bi_boot_params)interrupt_init:Timer4初始化为10ms一次env_init:检查可用的环境变量,没有什么实质性的东西,此时并未将环境变量从SD卡复制到内存。

weixin_53762042的博客 3072

u-boot中 _start, _armboot_start, .word等概念的理解

关于u-boot中 _start, _armboot_start, .word等概念的理解>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>例程:  .globl _armboot_start _armboot_start: .word _s

dongliqiang2006的专栏 2320

基础(ARM)——START.S的解释

目录 前言 1. 设置CPU模式 1.1. globl 1.2. _start 1.3. ldr 1.4. .word 1.5. .balignl 1.6. _TEXT_BASE _armboot_start 1.7. _bss_start _bss_end 1.8. IRQ_STACK_START FIQ_STACK_START 前言 对于uboot的start...

口袋里的跳跳糖 5146

u-boot启动代码之start_armboot分析(原创)

u-boot-1.1.3  这里主要对start_armboot函数执行流程进行分析 首先是定义一个指针变量DECLARE_GLOBAL_DATA_PTR,这是一个宏定义,原型在 u-boot-1.1.3\include\asm-arm\global_data.h文件中 #define DECLARE_GLOBAL_DATA_PTR     register vol

qinglongzhan的博客 566

_armboot_start 内容的疑问

 --------------------------------------------------------------------------------"aaronwong: u-boot中代码的疑问(_armboot_start与_start)?12Gm---------------------------=j我使用的是u-boot-1.3.0-rc2。在cpu/pxa/s

咕唧咕唧shubo.lk的专栏 6035

u-boot中代码的疑问(_armboot_start与_start?)

我使用的是u-boot-1.3.0-rc2。在cpu/pxa/start.S中,有如下的标号定义: _TEXT_BASE: .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址,我设置为0xa170 0000 */ .globl _armboot_start _armboot_start: .word _start /*_start是程序入口,链接完毕它的值应该是0xa17

lemon_fantasy的专栏 5371
上一篇: cpio命令文件备份和恢复
下一篇: ARM汇编指令英文缩写---(部分)
蚂蚁de臂膀
博客等级 码龄12年 21粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值