在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