2010-05-01 80 views
8

我對specification of mmap感到困惑。mmap的對齊和粒度

pa是MMAP(同說明書)

PA = MMAP(ADDR,LEN,PROT,旗幟,法爾茲,關閉)的返回地址;

在成功以下範圍我的函數調用後認爲是有效的

[PA,PA + LEN)

我的問題是以下的範圍是否仍然有效?

[ROUND_DOWN(PA,頁大小),ROUND_UP(PA + LEN,頁大小))
[鹼,鹼+尺寸]用於短

也就是說:

  1. base總是對齊頁面邊界?
  2. size始終是頁面大小的倍數(換句話說粒度是頁面大小)?

感謝您的幫助。

我認爲是在本段中暗示:

關閉參數被約束爲根據當傳遞_SC_PAGESIZE或_SC_PAGE_SIZE通過sysconf()返回的值被對準和尺寸。當指定MAP_FIXED時,應用程序應確保參數addr也符合這些約束條件。 該實現在整個頁面上執行映射操作。因此,當參數len不需要滿足大小或對齊約束時,實現應該在任何映射操作中包括由範圍[pa,pa + len)指定的任何局部頁面。

但我不確定,我在POSIX上沒有太多經驗。

  • 請給我多些明確明確證據
  • 或者告訴我至少一個支持POSIX和具有不同的行爲

感謝agian系統。

回答

3

考慮到mmap有很多不同的模式和配置,你的問題是相當開放的,但我會盡力涵蓋最重要的一點。

以您將文件映射到內存的情況爲例。文件中數據的開頭將始終植根於mmap()的返回地址。儘管操作系統實際上可能在頁面邊界創建了映射,但我不相信POSIX標準要求操作系統將此內存寫入可寫(例如,如果需要,它可以強制這些區域的段錯誤)。在映射文件的情況下,對於這個額外的存儲器地址區域是是沒有意義的,這是由文件支持的,所以對這些區域進行未定義更有意義。

但是,對於MMAP_ANONYMOUS,內存很可能是可寫的 - 但同樣,使用此內存也是不明智的。

此外,當你使用mmap()時,你實際上是在使用glibc的mmap()版本,並且它可以切片和骰子,無論如何它認爲合適。最後,值得注意的是,在兼容POSIX的OSX上,您提供的引用文本不會出現在mmap()的手冊頁中。