Linux内核中的内存分配

我今天接受了一个采访,被问到这个问题。 如果您被要求分配大小为2KB的内存,并且分配的内存应该与页面alignment,您将使用哪种内核内存分配策略。

KMALLOC处理较小的内存分配策略,但它支持的最低单位是4KB,这是物理页面的大小。 我问他,如果他期待slab分配器? 他没有积极回答。

Solutions Collecting From Web of "Linux内核中的内存分配"

我读了: http : //www.makelinux.net/books/lkd2/ch11lev1sec4

该函数返回一个指向至少大小为字节长度的内存区域的指针

我知道系统操作x86(32位) – 在RAM 4GB的最大大小映射,但它包括引用和信息暴力。

所以4GB是所有可用的空间,转换为'KB'= 4194304 KB,存储器Ram等于网格4194304空间(索引和bory信息),或者方形的一边(在拉丁基数中)SQRT(4194304)=所有大小只索引信息,以及“int flags”下方)

void * kmalloc (size_t size,int flags)

你可能想要使用函数,使用KB不同的2或4。

ATT

对于页面对齐的内存分配使用alloc_pages / alloc_page 。 您也可以使用_ _get_free_pages / __ get_free_page 。 __get_free_page最终只使用alloc_pages。 这些函数用于从物理内存中分配页面。 这些分配器是物理内存分配器好友分配器

你假设kmalloc分配最小4KB的内存是错误的。 kmalloc基于slab分配器 。 做一个猫/ proc / slabinfo你会知道有几个板已经为kmalloc创建。 这些平板将减少使用kmalloc进行分配的内部内存碎片。 所以,如果你分配4个字节,那么只有8个字节将从kmalloc-8的kmalloc板(4字节的内部分片)分配。 如果你分配9个字节,那么从kmalloc-16平板分配16个字节,依此类推。

kmalloc,alloc_page / s,__get_free_page / s不需要页表。 返回的虚拟内存地址只是偏移地址

虽然你没有问,但我会提到的是, vmalloc是另一种使用资源图分配器的分配技术。 通过vmalloc分配的非连续内存通过使用内核主页表swapper_pg_dir

Mel Gorman和专业Linux内核体系结构书中提到了不同的Linux分配器。 通过这些,这将有所帮助。