驱动申请大块内存

xiaoxiao2021-02-27  529

内核版本:3.10.0

1、ioremap_nocache

/*      * Don't allow RAM to be mapped - this causes problems with ARMv6+      */     if (WARN_ON(pfn_valid(pfn)))         return NULL;

该函数内核源码中有如上一段,无法用于进行内存映射,用于对内存一下的寄存器I/O 空间进行映射

2、slab slub slob

Slab是基础,是最早从Sun OS那引进的;

Slub是在Slab上进行的改进,在大型机上表现出色(不知道在普通PC上如何),并且能更好的适应large NUMA系统;SLUB相对于SLAB有5%-10%的性能提升和减少50%的内存占用

Slob是针对小型系统设计的,当然了,主要是嵌入式

3、kmalloc

 kmalloc并不直接从分页机制中获得空闲页面而是从slab页面分配器那儿获得需要的页面,slab的实现代码限制了最大分配的大小为 128k。为了kmalloc能申请出更大内存,使用slub的方式申请。

static __always_inline void *kmalloc(size_t size, gfp_t flags) {        if (__builtin_constant_p(size)) {         if (size > KMALLOC_MAX_CACHE_SIZE)             return kmalloc_large(size, flags);         if (!(flags & GFP_DMA)) {             int index = kmalloc_index(size);             if (!index)                 return ZERO_SIZE_PTR;             return kmem_cache_alloc_trace(kmalloc_caches[index],                     flags, size);         }     }     return __kmalloc(size, flags); }

当size大于KMALLOC_MAX_CACHE_SIZE(8K),认为就是大块内存,调用kmalloc_large,最终调用alloc_pages函数调用__alloc_pages_slowpath函数,里面有最大限制:

if (order >= MAX_ORDER) {         WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN));                                                                                                          return NULL;     }

#ifndef CONFIG_FORCE_MAX_ZONEORDER                                                                                                                 #define MAX_ORDER 11                                                                                                                               #else                                                                                                                                              #define MAX_ORDER CONFIG_FORCE_MAX_ZONEORDER                                                                                                       #endif

默认是11,即可以申请2^10 * 4K = 4M,可以通过修改CONFIG_FORCE_MAX_ZONEORDER 配置增加,来增大可申请值。

src/arch/arm/Kconfig:

config FORCE_MAX_ZONEORDER     int "Maximum zone order" if ARCH_SHMOBILE     range 11 64 if ARCH_SHMOBILE     default "12" if SOC_AM33XX     default "9" if SA1111     default "12" if ARCH_HI3536     default "11"

这个就是物理页面伙伴算法支持的最大块即4M。

转载请注明原文地址: https://www.6miu.com/read-886.html

最新回复(0)