在学习嵌入式,编写裸板程序时,遇到在Makefile中需要定义text的地址,感到很疑惑(我比较菜,大婶出门右拐),因为之前都是在linux系统上执行程序。
example:
.extern main
.text
.global _start
_start:
Reset:
ldr sp, =4096
bl disable_watch_dog
bl memesetup
bl copy_steppingstone_to_sdram
ldr pc, =on_sdram
on_sdram:
ldr sp, =0x34000000
ldr lr, =halt_loop
ldr pc, =main
halt_loop:
b halt_loop
Makefile:
gcc-xxxx-ld -Ttext0x30000000 -o godLike
.........................................
查阅资料并思考,过程如下:
1/裸板程序下载到nandflash的0地址处(这个地址是程序的加载地址)
2/小于4k的程序,需要把自己copy到sdram中。(因为cpu的内部ram只有4k大小)
3/程序跳转到sdram执行后,如何定位自己的地址呢?这就需要在ld时指定自己的text段地址
为什么裸板程序需要指定text地址,基于操作系统的就不需要呢?用脚趾头想也知道楼,linux系统有自己的运行环境,已经帮你都打理好裂。
makefile在ld时将text定义位30000000,在裸板程序中也是将自己从0 copy到0x3000000的,这个很重要,重要的事情说三便,说三遍,三遍。
程序是如何总0开始执行的呢?首先程序被烧录nandflash0x00处,开始执行,记住,程序并没有认为自己在0x00,程序认为自己在0x3000000处,因为编译时指定裂text的地址位0x3000000. 既然地址不对,你他吗不是在耍老子吗?
因为裸板没有操作系统的运行环境,只知道自己的当前的物理地址,存放在pc寄存器中,裸板关键的一步让自己的物理地址和text的地址对应上的是ldr pc, =on_sdram这条指令。
程序认为自己从0x3000000处开始的,这个地址叫做“运行地址”。所以他认为on_sdram这个标记的地址位0x300004,而在将自己copy到0x3000000后,自己也的确在这个地址。这样就可以一起愉快的外耍了。。。。。。。
结合这篇博客理解arm的物理地址,期望物理地址,运行地址概念!
http://blog.sina.com.cn/s/blog_76894ccd01014xwm.html