2014-12-02 51 views
3

我正在使用mmap構建malloc的自定義實現。我如何獲得mmap分配的字節數?

如果用戶想要分配500字節的內存,我打電話mmap(0, 500, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0)mmap返回一個指向大小爲4096的塊的指針(如果這是頁面大小)。

在我的鏈接列表中,我希望將一個塊設置爲標記爲500的字節,並將一個塊設置爲4096-500 = 3596個字節標記爲空閒。不清楚,但是多少內存mmap真的分配。我怎樣才能得到這些信息?

+2

我不認爲這是一個好方法。你應該分配大於4k的塊。否則,你將會得到很多大塊的東西。您還需要考慮'mmap'的開銷和映射區域的最大數量。 – 2014-12-02 21:46:53

回答

0

mmap()原型爲:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);` 

技術上只能保證,這將分配length字節。但是,實際上它會分配整個頁面(即PAGE_SIZE的倍數),但不保證您可以使用除length之外的任何內容。確實按照手冊頁:

offset必須是由sysconf(_SC_PAGE_SIZE)返回的頁面大小的倍數。

注意這裏是length是的PAGE_SIZE多,但你不妨圍捕lengthPAGE_SIZE多(因爲這是發生了什麼事情無論如何都要分配)沒有限制,在這種情況下的內存量分配正好是length。如果不這樣做,它將分配包含length字節的整個頁面的最小數量。

+0

「雖然你不能保證你可以使用'長度'以外的任何東西」。這是不正確的,你可以隨時使用整個頁面。 – 2014-12-02 22:32:41

+0

@PerJohansson - 參見http://pubs.opengroup.org/onlinepubs/7908799/xsh/mmap.html - *「從'pa'開始的地址範圍和持續的'len'字節對於可能的(不是必須是當前的)進程的地址空間從'off'開始並繼續'len'字節的字節範圍對於由'fildes'表示的文件或共享內存對象中可能的(不一定是當前的)偏移量是合法的。 「* – abligh 2014-12-02 22:37:12

+0

另外*」因此,儘管參數'len'不需要滿足大小或對齊約束,實現將在任何映射操作中包含由範圍'[pa,pa + len]'指定的任何部分頁面。 「* – abligh 2014-12-02 22:41:01