最近在研究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
这我就看不懂了,是怎么进行全局变量的引用?