2011-05-07 222 views
1

假設我正在啓動同一程序的兩個實例。兩個程序的文本區域是否具有相同的虛擬地址?虛擬地址

回答

0

可能不是,但它可能會。每個進程都有自己獨立的內存空間。

1

取決於。在大多數系統中,如果在相同的環境(相同的參數等)中運行相同的程序兩次,則會發現相同的地址映射。這很簡單,因爲大部分流程所做的工作都是確定性的,僅取決於環境,命令行參數,讀取的文件內容,而不是更改數據(如日期或進程ID)。這在調試時非常有用:如果您重新啓動程序,有時甚至在更改和重新編譯小代碼後,內存佈局仍可能保持不變。當然,並行運行的程序的不同實例可能具有相同的虛擬地址,但它們不會具有相同的物理地址。

某些系統(如OpenBSD或具有各種強化設置的Linux)實施address space layout randomization (ASLR)。 ASLR意味着每次進程啓動時,其代碼,數據,堆棧和堆的虛擬地址都是隨機確定的。這是一項安全功能,旨在加強安全漏洞的攻擊:攻擊代碼不能只訪問已知地址處的已知代碼。但是,隨着ASLR變得越來越流行,漏洞利用也變得更加複雜。 ASLR仍然很有用,因爲它增加了漏洞利用程序的工作量,卻不會增加很多複雜性。