2010-10-18 752 views
3

malloc返回的地址是虛擬地址,還是內存分配的實際物理地址?malloc的返回值是虛擬地址還是物理地址?

編輯:

我讀的地方「在一些實現,調用free()釋放內存給系統,而在其他被釋放回過程」。 「釋放回系統」意味着內存是實際的物理內存,「釋放回到進程」意味着它是虛擬內存?

+3

你希望答案能爲你帶來什麼?它真的取決於大量的參數,如架構,操作系統等...你能提供更多的信息嗎? – fbrereto 2010-10-18 05:24:47

+0

到你的編輯:沒有。釋放回系統意味着內存可以被OS提供給另一個進程。釋放回到進程意味着內存可以在未來的調用中返回到'malloc',而不是在另一個進程中。例如,釋放的塊可能被添加到每個進程的可用塊列表中。這與虛擬內存沒有任何關係。通常這是因爲進程以大塊的形式從操作系統獲取內存,然後將其拆分成malloc中的小塊。它不能釋放到操作系統,除非它知道整個塊未被使用。 – 2010-10-18 10:28:50

回答

14

這是在當前過程中有效的地址。它是虛擬地址還是物理地址取決於底層平臺。

3

還有沒有在C標準中的真實或虛擬記憶的概念,所以這個問題是沒有意義的。無論如何,它的實現都是免費的。

在虛擬內存操作系統中,您幾乎可以肯定會得到一個虛擬地址。在非虛擬內存的操作系統中,你可能不會。

在這兩種情況下你將得到的是一個地址,你可以使用它爲C提供地址的所有常見事物,例如解引用,釋放,重新分配等等。 是您唯一的保證,也是您通常需要關注的唯一事情。

如果願意,您可以免費給您一個順序ID列表(1,2,3,...),前提是所有預期的操作仍然按照所宣傳的方式工作。當然,這在目前的體系結構中可能效率不高,但它仍然可行。

+0

我看不出你如何在順序標識符上執行任何合理的算術來訪問已分配塊中的不同字節...... ;-)也許在高32位中的順序標識符和在低32位中的偏移量? – 2010-10-18 05:33:58

+0

我沒有說這是合理的,只是可能的:-)如果爲索引生成的代碼('x []'和'*(x + n)')和比較(以及其他可能的事情)已經足夠複雜處理序列性質,它可能是可行的。我當然不想開發或使用這樣的系統,但根據標準,這並不會降低可能性。例如,將內存ID向上移動32位(如您所建議的)可以在生成的代碼中自動執行。我的觀點是你只應該制定標準規定的假設。 – paxdiablo 2010-10-18 05:42:01

0

我可以想到,你會關心一個物理內存地址的唯一原因是,如果你想直接與某個內存映射硬件對話...在這種情況下,你需要更多東西比malloc()低。您必須使用內核或驅動程序界面,或者禁止使用內核或驅動程序界面,使用類似UNIX的/dev/mem之類的操作系統後臺 - 或者,最好自己編寫驅動程序,將所需的物理內存映射到應用程序的虛擬內存中。