主题 : arm中怎么实现数据的引用 复制链接 | 浏览器收藏 | 打印
数据引用求学中
级别: 新手上路
UID: 25926
精华: 0
发帖: 20
金钱: 105 两
威望: 21 点
贡献值: 0 点
综合积分: 40 分
注册时间: 2010-07-31
最后登录: 2015-07-26
楼主  发表于: 2011-12-07 10:09

 arm中怎么实现数据的引用

最近在研究u-boot的时候,突然想到个问题,u-boot中怎么实现对变量的引用的?
我的板子上将启动代码是放在nand中的,那么在前4k代码中必须是位置无关的代码,而且在前4k中必须将以后的代码加载到内存正确的位置上,后来想到了数据的问题,那数据时怎么解决的?前4k中要使用数据的话不是无法成功了?
还有我看u-boot中没有对初始化初值的全局变量的处理,但其中有对bss段的处理,那有初值的全局变量是怎么对应到正确的内存位置的?
我写了一个简单的c程序
[code]]#define GPBCON      (*(volatile unsigned long *)0x56000010)
#define GPBDAT      (*(volatile unsigned long *)0x56000014)


int my_text;
int ginit = 3;
int main()
{
    GPBCON = 0x00015400;    // 设置GPF4为输出口, 位[9:8]=0b01
   GPBDAT = ~(1<<5);    // GPF4输出0,LED1点亮
    my_text = 1;
    ginit = 2;
    return 0;
}[/code
其中定义了两个变量,一个有初值,一个无初值,
反汇编后得
30000018 <main>:
30000018:    e1a0c00d     mov    ip, sp
3000001c:    e92ddc00     stmdb    sp!, {sl, fp, ip, lr, pc}
30000020:    e24cb004     sub    fp, ip, #4    ; 0x4
30000024:    e59fa04c     ldr    sl, [pc, #76]    ; 30000078 <.text+0x78>
30000028:    e08fa00a     add    sl, pc, sl
3000002c:    e3a03456     mov    r3, #1442840576    ; 0x56000000
30000030:    e2833010     add    r3, r3, #16    ; 0x10
30000034:    e3a02b55     mov    r2, #87040    ; 0x15400
30000038:    e5832000     str    r2, [r3]
3000003c:    e3a03456     mov    r3, #1442840576    ; 0x56000000
30000040:    e2833014     add    r3, r3, #20    ; 0x14
30000044:    e3e02020     mvn    r2, #32    ; 0x20
30000048:    e5832000     str    r2, [r3]
3000004c:    e59f3028     ldr    r3, [pc, #40]    ; 3000007c <.text+0x7c>
30000050:    e79a2003     ldr    r2, [sl, r3]
30000054:    e3a03001     mov    r3, #1    ; 0x1
30000058:    e5823000     str    r3, [r2]
3000005c:    e59f301c     ldr    r3, [pc, #28]    ; 30000080 <.text+0x80>
30000060:    e79a2003     ldr    r2, [sl, r3]
30000064:    e3a03002     mov    r3, #2    ; 0x2
30000068:    e5823000     str    r3, [r2]
3000006c:    e3a03000     mov    r3, #0    ; 0x0
30000070:    e1a00003     mov    r0, r3
30000074:    e89dac00     ldmia    sp, {sl, fp, sp, pc}
30000078:    00000064     andeq    r0, r0, r4, rrx
3000007c:    00000000     andeq    r0, r0, r0
30000080:    00000004     andeq    r0, r0, r4
这我就看不懂了,是怎么进行全局变量的引用?
数据引用求学中
级别: 新手上路
UID: 25926
精华: 0
发帖: 20
金钱: 105 两
威望: 21 点
贡献值: 0 点
综合积分: 40 分
注册时间: 2010-07-31
最后登录: 2015-07-26
1楼  发表于: 2011-12-07 14:53
没人回复啊?是我问题描述的不准确啊??
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2011-12-07 17:56
我的板子上将启动代码是放在nand中的,那么在前4k代码中必须是位置无关的代码,而且在前4k中必须将以后的代码加载到内存正确的位置上,后来想到了数据的问题,那数据时怎么解决的?前4k中要使用数据的话不是无法成功了?

的确是这样,在这种情况下,前4K中的代码是不能引用data段中的地址的,C函数只能用栈里的本地变量或者是bss段中的未初始化的全局变量。

还有我看u-boot中没有对初始化初值的全局变量的处理,但其中有对bss段的处理,那有初值的全局变量是怎么对应到正确的内存位置的?

data段中的数据是包含在生成的u-boot image里的。当u-boot image被从NAND Flash复制到SDRAM的时候,里面的data段数据也就复制到了相应的位置。从这个时候开始,程序就可以使用有初始值的全局变量了。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
数据引用求学中
级别: 新手上路
UID: 25926
精华: 0
发帖: 20
金钱: 105 两
威望: 21 点
贡献值: 0 点
综合积分: 40 分
注册时间: 2010-07-31
最后登录: 2015-07-26
3楼  发表于: 2011-12-08 14:22
引用第2楼kasim于2011-12-07 17:56发表的  :

的确是这样,在这种情况下,前4K中的代码是不能引用data段中的地址的,C函数只能用栈里的本地变量或者是bss段中的未初始化的全局变量。

这里bss段的未初始化变量,链接的时候链接地址不是0地址,那bss段是连接到ram中,那此时使用bss段,应该先初始化好存储管理器,这样才能去引用ram中的bss段?
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2011-12-11 20:50

 回 3楼(zhuanxu) 的帖子

是的。幸运的是,当复制NAND Flash中数据到RAM中时,RAM已经而且必须初始化好了。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."