2016-11-10 51 views
0

我想了解內存分配如何在編譯和加載程序的不同階段工作。內存地址:Linker VS.加載程序

1)編譯器和彙編產生代碼和數據段開始該地址爲0

2)鏈接器通過存儲器位置 與每個符號的定義相關聯,然後修改所有的引用重新定位這些部分 到那些符號,以便它們指向這個內存位置。

3)加載程序將程序加載到主內存中,在進程的上下文中,因此,在這一步,分頁和所有與內存管理相關的操作完成。

我的問題是兩件事:

1)如何可通過與由裝載機分配的那些鏈接指定的地址。我們可以調用鏈接器地址虛擬地址嗎?

2)是否所有的程序具有相同的虛擬地址(即最終被映射到不同的物理地址?)

回答

0

一般來說編譯器生成的重定位代碼不會在任何特定的地址開始。有些情況下,這是不完全可能的。例如。

int x ; 
int *y = &x ; 

這些需要特殊處理。

鏈接器合併編譯器引用的程序段。鏈接的輸出是一個程序,指導加載程序如何將程序放在內存中。這些指示將處理上述情況。

加載程序按照鏈接器提供的說明進行操作。

1)鏈接器分配的地址與加載器分配的地址有什麼關係。我們可以調用鏈接器地址虛擬地址嗎?

鏈接器通常會生成可重定位代碼,除非編譯器或程序集產生了無法重定位的內容。鏈接器不會生成虛擬地址。

2)是否所有的程序具有相同的虛擬地址(即最終被映射到不同的物理地址?)

在大多數系統中,程序的每次運行產生相同的邏輯地址佈局。作爲一種安全措施,情況並非如此。每次程序加載時,它都會以不同的方式加載。