位置无关码的理解和使用

1.

位置无关码:CPU取指时用相对地址取指令(比如pc +4),只要其相对地址没有变,都能够取指并运行。

位置相关码:利用绝对地址取指并运行,这就需要你存放程序(链接过程中)需要按照连接脚本的要求那样执行(Makefile里面有 -Ttext xxx指定或连接脚本)。


2.

对于ARM启动流程,一般先将BL1下载到ROM的0地址去运行,再将整个bootloder复制到DDR中去运行,一般境况下两者的地址并不相同,程序在SDRAM中的地址重定位过程必须由程序员来完成。这样就有了位置无关代码的概念,指代码不在连接时指定的运行地址空间,也可以执行,它一段加载到任意地址空间都能执行的特殊代码。这样在steppingstone设计的代码要用位置无关设计(BL1不知道自己会在哪运行)。 


3.

位置无关码的应用:

1). 程序在运行期间动态加载到内存;  
2). 程序在不同场合与不同程序组合后加载到内存(共享的动态链接库);  

3). 在运行期间不同地址相互之间的映射(如bootloader)


4.

使用mov pc ,xxx ;  ldr pc ,xxx等就是位置相关码。这些使用绝对指令寻址。


而使用bl ,b ,adr,ldr一般为位置无关码。


在使用b, bl调用C语言中的函数里不要使用全局变量,因为C中全局变量的地址也是根据链接地址生成的。



参考:http://www.cnblogs.com/mylinux/p/5577472.html





你可能感兴趣的:(arm裸机,位置相关码,重定位,PIC)