linux内核内存分配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux内核内存分配相关的知识,希望对你有一定的参考价值。

实验要求:

1、编写一个内核模块,在模块中分配内存并访问

2、理解并验证kmalloc、vmalloc等函数的区别。

背景知识:

1、Linux内存页管理

Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成4K大小页,作为使分配和回收内存的基本单位。在分配内存时尽量分配连续内存,避免TLB的刷新率过高。故此Linux采用了“伙伴“关系来管理空闲页框。因此空闲页面分配时也需要遵循伙伴关系。最小单位是2的幂倍页面大小。内核中分配空闲页框的基本函数是get_free_page/get_free_pages,他们或是分配单页或是分配指定的页框。

2、slab技术介绍

以页为最小单位分配内存对于内核管理系统物理内存来说的确比较方便,但内核自身最常使用的内存却往往是很小的内存块(远远小于1页),为了满足内核对于这种小内存块的需要,Linux系统采用了一种被称为slab分配器的技术。slab分配器的实现相当复杂,其核心思想就是”存储池“的运用。内存片段(小块内存)被看作对象,当使用完后,并不直接释放而是被缓存到”存储池“里,留作下次使用,这无疑避免了频繁创建于销毁对象所带来的额外负载。

slab是将页面(来自于伙伴关系管理的空闲页框链)撕碎成众多小内存块以供分配,slab中的对象分配和销毁使用kmem_cache_alloc与kmem_cache_free。

3、kmalloc

一般来说内核程序中对小于一页的小块内存的请求会通过slab分配器提供的接口kmalloc来完成(虽然它可分配32到131072字节的内存)。从内核内存分配角度讲kmalloc可被看成是get_free_page(s)的一个有效补充,内存分配粒度更灵活了。

4、vmalloc

内存管理理论中有个”分片“的概念。分片又分为外部分片和内部分片。所谓内部分片是说系统为了满足一小段内存区(连续)的需要,不得不分配了一大区域连续内存给它,从而造成了空间浪费;外部分片是指系统虽然有足够的内存,但却是分散的碎片,无法满足对大块”连续内存“的需求,slab技术解决了内部分片,但伙伴关系只是减轻了外部分片,但为彻底消除。

为了避免外部分片,Linux内核允许内核程序在内核地址空间中分配虚拟地址,同样也利用页表(内核页表)将虚拟地址映射到分散的内存页上。内核提供了vmalloc函数分配内核虚拟内存,该函数不同于kmalloc,它可以分配较kmalloc大得多得内存空间(可远大于128KB,但必须是页大小的倍数),但相比kmalloc来说vmalloc需要对内核虚拟地址进行重映射,必须更新内核页表,因此分配效率上要低一些(用时间换空间)。

 

以上是关于linux内核内存分配的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

Linux内核内存分配函数之kzalloc和kcalloc

Linux 内核 内存管理内存管理架构 ③ ( Linux 内核中的内存管理模块 | 页分配器 | 不连续页分配器 | 内存控制组 | 硬件设备内存管理 | MMU | 页表缓存 | 高速缓存 )

linux系统无法分配内存

Linux 内核 内存管理伙伴分配器 ② ( 伙伴分配器分配内存流程 )

Linux 内核 内存管理伙伴分配器 ② ( 伙伴分配器分配内存流程 )