Linux内核中的内存分配

时间:2015-05-06 19:29:57

标签: linux memory memory-management linux-kernel memory-alignment

我今天接受了采访,并被问到这个问题。如果要求您分配大小为2KB的内存并且分配的内存应该是页面对齐的,那么您将使用什么内核内存分配策略。

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

2 个答案:

答案 0 :(得分:7)

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

你认为kmalloc分配最小4KB的内存是错误的。 kmalloc 基于 slab allocator 。做一个cat / proc / slabinfo你会知道已经为kmalloc创建了几个slab。这些slab将使用kmalloc减少分配的内部内存碎片。因此,如果你分配4个字节,那么将只从kmalloc-8的kmalloc slab(4个字节的内部碎片)中分配8个字节。如果分配9个字节,则从kmalloc-16 slab分配16个字节,依此类推。

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

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

进行访问

Mel Gorman书和Professional Linux内核架构书中提到了不同的Linux分配器。通过这些,它会有所帮助。

答案 1 :(得分:-1)

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

  

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

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

所以4GB是可用的全部空间,转换为'KB'= 4194304 KB,Memory Ram等于Grid 4194304空格(索引和bory信息),或方块的一侧(在拉丁Radix Quadratum中)SQRT(4194304) =所有大小仅索引信息,以及“int flags”下面的

  

void * kmalloc (size_t size,int flags)

您可能希望使用该功能,以使用KB不同的2或4。

ATT