0
讓我們假設一個進程詢問mmap
只有50個字節的內存。整個頁面是否會分配給這個過程?其餘的只是浪費了嗎?另外,如何處理內核分配函數,如kmalloc
?在Linux中如何處理內存分配小於PAGE_SIZE的內存?
讓我們假設一個進程詢問mmap
只有50個字節的內存。整個頁面是否會分配給這個過程?其餘的只是浪費了嗎?另外,如何處理內核分配函數,如kmalloc
?在Linux中如何處理內存分配小於PAGE_SIZE的內存?
從man 3p mmap
:
實施進行映射操作過整個頁面。因此,雖然參數
len
不需要符合大小或對齊約束,但是在任何映射操作中,實施應包括由範圍[pa,pa+len)
指定的任何部分頁面。
所以,實際上,當你使用mmap
50字節時,你實際上會映射整個頁面。
關於內核情況,有一個頁面分配器(get_free_pages()/alloc_pages()
或類似的東西),但它們是低級函數,主要用於內存管理代碼。
正常kmalloc()
功能有點類似於用戶空間malloc()
:它會在內部分配整個頁面,但它會將它們分成更小的部分供調用者使用。
由於*「只有50個字節」*的mmap()請求無法在任何地方啓動,而是必須進行頁面對齊,這對於正在發生的事情有很強的暗示。 IOW無法請求或獲得頁面後半部分的分配。虛擬內存也使用頁表,而不是段表 – sawdust