是否mmap(當用MAP_ANONYMOUS調用時,即分配內存時)總是返回比先前調用更高的內存地址?如果不是這樣,有沒有辦法讓它始終返回更高的地址?mmap是否總是返回更高的地址
0
A
回答
3
默認情況下,mmap
可以按任意順序返回頁面邊界上對齊的任何地址。
如果你想強制返回的地址是你指定的地址,你可以使用MAP_FIXED
標誌,但這不是很便攜和可靠。這樣你就可以在特定的內核上將你的代碼與mmap
的特定實現綁定在一起。
但無論如何,爲什麼你總是需要比前一個更高的地址?可能更好的方法是改變程序的邏輯。
3
不一定,至少不是按照它的定義。
我相信,ASLR它可能會發生,高地址不再可用,所以mmap
必須選擇一些較低的地址範圍。顯然,在32位處理器(&內核)上,內存空間可能幾乎被填滿,所以當詢問一個大的mmap
-ed範圍時,內核應該找到一個適合的內核,並且可能在任何地方。
如果你想要一個單調的方向,使用sbrk(但我真的建議不要使用它)。
另一種可能是預分配一個非常大的使用mmap
與MAP_NORESERVE
在程序初始化的地址空間量(例如,幾TB),並調用mmap
與MAP_FIXED
該範圍內再次獲得真正的可用空間(更可管理的塊,例如幾十兆字節)。
@MetallicPriest:你真的應該激勵和解釋更多的問題。有那麼神祕和奇怪的(甚至我不能猜測所有的上下文),回答它們並不是很有趣。
相關問題
- 1. 檢查mmap的地址是否正確
- 2. clEnqueueMapBuffer是否總是返回相同CL緩衝區的相同地址?
- 3. 地圖總是返回undefined
- 4. isReachable總是返回true不管IP地址是什麼
- 5. 返回地址是否確保非空返回值?
- 6. malloc的返回值是虛擬地址還是物理地址?
- 7. My.Computer.Name是否總是返回大寫?
- 8. WebMethod是否總是返回XML?
- 9. PayPal是否總是返回payer_id?
- 10. 請問socket.recvfrom總是返回一個有效的地址嗎?
- 11. 這是否真的返回本地地址?
- 12. 如何檢查地址是否是回送地址nodejs
- 13. 爲什麼inet_ntoa總是返回我0.0.0.0作爲IP地址?
- 14. 函數返回後本地內存地址是否有效?
- 15. mmap是否返回對齊的指針值
- 16. 是GooglePlayServicesAvailable總是返回2
- 17. mmap()返回EINVAL
- 18. gethostbyname是否保證返回帶有IPv4地址的hostent結構?
- 19. C#IP地址總是:: 1
- 20. DLL是否總是有相同的基地址?
- 21. 虛擬內存是否總是爲進程提供更大的地址空間?
- 22. Hazelcast總是返回null,containsKey總是返回false
- 23. Mongodb更新$ pull總是返回1
- 24. 更新gridview總是返回空參數
- 25. 的cellForRowAtIndexPath總是返回零
- 26. 的EntityManager返回總是空
- 27. 的getResourceAsStream()總是返回空
- 28. 的intValue總是返回0
- 29. 返回地址
- 30. Pinging win2k16返回的是IPv6地址而不是IPv4
你爲什麼需要它來做到這一點? – 2011-12-14 12:14:07
那麼,在我的應用程序中,我通過數組保存了通過mmap分配的所有內存的起始地址,並且我需要在某些點上搜索它們。讓他們以排序的形式將允許我執行二進制搜索。你可以說,我可以在每次調用mmap後對它們進行排序,但問題是這個數組需要從信號處理器中讀取,並且你知道你不能在信號處理器中使用互斥信號或信號量,這成爲一個問題如果某個線程在從信號處理程序中讀取數組的同時對數組進行排序。 – MetallicPriest 2011-12-14 12:19:42