本文共 623 字,大约阅读时间需要 2 分钟。
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