内核版本: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。