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