【kernel 中内存分配那点事】

本文详细介绍了Linux内核中的内存管理机制,包括kmalloc用于分配小块连续内存,最大128KB,适用于快速分配;vmalloc则用于分配大块非连续内存,适合大内存需求;而DMA分配则针对设备驱动,确保内存适配DMA传输。此外,文章还提及了__get_free_pages作为页分配的基础方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先呢作为车载bsp开发人员,写大量的内核代码是不现实的事情,多数都是修修改改,但是要有内核代码阅读浏览理解的能力,毕竟linux kernel 还是很nb 的,所有技术人员深入研究内核代码是必须的,也毛病,而且越是资深的大佬对这方便越牛。

kernel 中内存分配的常用几种方式:

1、kmalloc: (分配连续的物理空间,最大为128K)

 通用 cache

  void *kmalloc(size_t size, gfp_t flags)

  kmalloc 基于以下几种size的mem cache:32, 64, 128, 256, 512, 1,024, 2,048, 4,096,8,192, 16,384, 32,768, 65,536 和 131,072 bytes。其本质也是调用kmem_cache_alloc来分配object。所以kmalloc一次最大可分配的size为128KB。kmalloc分配速度很快,在分配时需注意gfp flag

参数:在不interrupt上下文(ISR, softirq, tasklet)及不可睡眠上下文使用GFP_ATOMIC。

     内核还增加了内存清零的分配函数:kzalloc。

 专用 cache

  kmem_cache_create()

  void *kmem_cache_alloc(struct kmem_cache *cachep, gfp_t flags)如果你需要频繁的分配和释放某个结构,建议不要采用kmalloc,而是自己在slab系统中创建memory cache。

  指定该结构的object size。分配时使用kmem_cache_alloc。同样的slab object大小也有限制,一般情况下一个MAX_OBJ_ORDER是5,也就是32个页,128KB。

2、vmalloc (非连续内存分配,可以申请的较大的连续的内存空间) 

void *vmalloc(unsigned long size)超过128KB的内存显然不能使用slab分配,并且当申请的连续内存大小不能在buddy系统中得到满足,那么就需要使用vmalloc。vmalloc为了把物理的非连续页一个个映射,从而导致比直接内存映射大的多的后援缓冲区抖动。除非需要特别大的内存,否则尽量不要使用vmalloc。

3、基于DMA 分配

  void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp)

  在某些arch中,可以使用dma_alloc_coherent来分配DMA专用内存。列入在arch/arm/mm/consistent.c中,该函数先分配最小可满足size的2^order内存,然后释放2^order-size多余的页给buddy。而arch/i386/kernel/pci-dma.c中,则直接分配2^order块内存。

4、__get_free_pages(分配大空间的连续物理内存,4MB)

页分配

  unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)直接从buddy系统中获得原始页。最原始的分配方式。

  slab分配器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值