2011-12-14 69 views
0

是否mmap(當用MAP_ANONYMOUS調用時,即分配內存時)總是返回比先前調用更高的內存地址?如果不是這樣,有沒有辦法讓它始終返回更高的地址?mmap是否總是返回更高的地址

+4

你爲什麼需要它來做到這一點? – 2011-12-14 12:14:07

+0

那麼,在我的應用程序中,我通過數組保存了通過mmap分配的所有內存的起始地址,並且我需要在某些點上搜索它們。讓他們以排序的形式將允許我執行二進制搜索。你可以說,我可以在每次調用mmap後對它們進行排序,但問題是這個數組需要從信號處理器中讀取,並且你知道你不能在信號處理器中使用互斥信號或信號量,這成爲一個問題如果某個線程在從信號處理程序中讀取數組的同時對數組進行排序。 – MetallicPriest 2011-12-14 12:19:42

回答

3

默認情況下,mmap可以按任意順序返回頁面邊界上對齊的任何地址。

如果你想強制返回的地址是你指定的地址,你可以使用MAP_FIXED標誌,但這不是很便攜和可靠。這樣你就可以在特定的內核上將你的代碼與mmap的特定實現綁定在一起。

但無論如何,爲什麼你總是需要比前一個更高的地址?可能更好的方法是改變程序的邏輯。

3

不一定,至少不是按照它的定義。

我相信,ASLR它可能會發生,高地址不再可用,所以mmap必須選擇一些較低的地址範圍。顯然,在32位處理器(&內核)上,內存空間可能幾乎被填滿,所以當詢問一個大的mmap -ed範圍時,內核應該找到一個適合的內核,並且可能在任何地方。

如果你想要一個單調的方向,使用sbrk(但我真的建議不要使用它)。

另一種可能是預分配一個非常大的使用mmapMAP_NORESERVE在程序初始化的地址空間量(例如,幾TB),並調用mmapMAP_FIXED該範圍內再次獲得真正的可用空間(更可管理的塊,例如幾十兆字節)。

@MetallicPriest:你真的應該激勵和解釋更多的問題。有那麼神祕和奇怪的(甚至我不能猜測所有的上下文),回答它們並不是很有趣。