2017-08-02 148 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():它会在内部分配整个页面,但它会将它们分成更小的部分供调用者使用。