2013-08-31 33 views
0

在linux下,如果malloc不能從預分配頁面分配數據塊。它使用mmap()或brk()分配新頁面。我想澄清幾件事:Linux頁面分配

  1. 我不明白以下陳述,我認爲當我使用mmap()或brk()時,內核映射了我一整頁。但是分配器只是將我從新頁面中請求的內容分配給我?在這種情況下試圖訪問未分配的空間(在新映射的頁面中)不會導致頁面錯誤? (據我所知,它不推薦)

提供的libc分配器管理的每個頁面:切片他們分成較小的塊,將其分配給進程,釋放他們,等等。例如,如果你的程序使用4097個字節總,你需要使用兩頁,即使在現實中分配給你的地方4105之間,以4109個字節

  1. 如何進行分配知道VMA bounders?(我假設沒有使用系統調用),因爲保存該信息的VMA結構只能從內核模式訪問?

回答

2

系統級內存分配(通過mmapbrk)都是頁面對齊和頁面大小。這意味着,如果您使用malloc(或其他分配內存的libc API)少量內存(比如10個字節),則可以保證該頁內存中的所有其他字節都可讀,而不會觸發頁面錯誤。

Malloc和家人在從操作系統返回的頁面中做自己的簿記,所以libc使用的mmap'd頁面還包含一堆malloc元數據,除了你分配的任何空間。

libc分配器知道一切都在哪裏,因爲它調用brk()mmap()調用。如果它調用mmap()它傳遞一個大小,並且內核返回一個起始地址。然後,libc分配器將這些值存儲在其元數據中。

Doug Lea的malloc的實現是一個非常,非常有據可查的內存分配器實現,其意見將闡明如何分配器工作淡了很多一般: http://g.oswego.edu/dl/html/malloc.html