2017-08-02 147 views
0

讓我們假設一個進程詢問mmap只有50個字節的內存。整個頁面是否會分配給這個過程?其餘的只是浪費了嗎?另外,如何處理內核分配函數,如kmalloc在Linux中如何處理內存分配小於PAGE_SIZE的內存?

+0

由於*「只有50個字節」*的mmap()請求無法在任何地方啓動,而是必須進行頁面對齊,這對於正在發生的事情有很強的暗示。 IOW無法請求或獲得頁面後半部分的分配。虛擬內存也使用頁表,而不是段表 – sawdust

回答

0

man 3p mmap

實施進行映射操作過整個頁面。因此,雖然參數len不需要符合大小或對齊約束,但是在任何映射操作中,實施應包括由範圍[pa,pa+len)指定的任何部分頁面。

所以,實際上,當你使用mmap 50字節時,你實際上會映射整個頁面。

關於內核情況,有一個頁面分配器(get_free_pages()/alloc_pages()或類似的東西),但它們是低級函數,主要用於內存管理代碼。

正常kmalloc()功能有點類似於用戶空間malloc():它會在內部分配整個頁面,但它會將它們分成更小的部分供調用者使用。