執行位址和載入位址

2021-06-05 17:01:28 字數 2245 閱讀 9536

在連線目標**時,會提到執行位址和載入位址。這兩者有什麼區別呢?

載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址

。如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向ram,而載入位址是指向flash。**一般是燒寫在nand裡面,比如s3c2440 如果開機從nand啟動 其開始的4k**會被copy到2440內部的4kram 用於對關鍵硬體的初始化 這時候內部ram被對映為0x0位址。

如果從nor啟動,因為nor支援片上執行,**可以直接在nor上執行 此時nor便被對映成0x0,s3c2440 內部的4kram便被對映到了0x40000000處。

下面我們看看鏈結檔案。

對於.lds

檔案,它定義了整個程式編譯之後的連線過程,決定了乙個可執行程式的各個段的儲存位置。先看一下gnu官方**上對.lds

檔案形式的完整描述:

[cpp]view plain

copy

print?

sections  >region :phdr =fill  

...  

}  

secname和contents是必須的,其他的都是可選的。下面看看幾個常用的: 1、

secname

:段名2、

contents

:決定哪些內容放在本段,可以是整個目標檔案,也可以是目標檔案中的某段(**段、資料段等)

3、start:本段連線(執行)的位址,如果沒有使用at(

ldadr

),本段儲存的位址也是

start。gnu

**上說

start

可以用任意一種描述位址的符號來描述。

4、at(

ldadr

看乙個簡單的例子:

[cpp]view plain

copy

print?

"font-size:18px;">/* nand.lds */

sections    

second 0x30000000 : at(4096)    

}以上,

head.o

放在0x00000000

位址開始處,

init.o

放在head.o

後面,他們的執行位址也是

0x00000000

,即連線和儲存位址相同(沒有

at指定);main.o

放在4096

(0x1000

,是at

指定的,儲存位址)開始處,但是它的執行位址在

0x30000000

,執行之前需要從

0x1000

(載入處)複製到

0x30000000

(執行處),此過程也就用到了讀取

nand flash。這就是儲存位址和連線(執行)位址的不同,稱為載入時域和執行時域,可以在.lds

連線指令碼檔案中分別指定。

編寫好的.lds

檔案,在用

arm-linux-ld

連線命令時帶

-tfilename

來呼叫執行,如arm-linux-ld –tnand.lds x.o y.o –o xy.o。也用

-ttext

引數直接指定連線位址,如arm-linux-ld –ttext 0x30000000 x.o y.o –o xy.o。

總之:

連線位址<==>執行位址

儲存位址<==>載入位址

既然程式有了兩種位址,就涉及到一些跳轉指令的區別,下面就來具體看看這些跳轉指令。

arm彙編中,常有兩種跳轉方法:

b跳轉指令、

ldr指令向

pc賦值。(1)

b step1 :b

跳轉指令是相對跳轉,依賴當前pc

的值,偏移量是通過該指令本身的

bit[23:0]

算出來的,這使得使用

b指令的程式不依賴於要跳到的**的位置,只看指令本身。 (2

)ldr pc, =step1 

:該指令是從記憶體中的某個位置(

step1

)讀出資料並賦給

pc,同樣依賴當前

pc的值,但是偏移量是那個位置(step1

)的連線位址(執行時的位址),所以可以用它實現從flash

到ram

的程式跳轉。

執行位址和載入位址

在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址 如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向ram,而載入位址是...

執行位址和載入位址

執行位址和載入位址 在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址。如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向...

執行位址和載入位址

在連線目標 時,會提到執行位址和載入位址。這兩者有什麼區別呢?載入時位址就是程式放置的位址,執行位址就是程式定位的絕對位址,也即在編譯連線時定位的位址。如果程式是在flash裡執行,則執行位址和載入位址是相同的。如果程式是在ram裡執行,但程式是儲存在flash裡,則執行位址指向ram,而載入位址是...