kmalloc和vmalloc对比

1. kmalloc和vmalloc对比 以ARM64为例,不考虑高端内存。 1.1. 实现原理 kmalloc和vmalloc底层函数都是__alloc_pages。 kmalloc会根据申请大小是否大于KMALLOC_MAX_CACHE_SIZE来决定使用slab还是__alloc_pages,而slab最终也是调用__alloc_pages。 1.2. 初始化 默认情况下,kmalloc和vmalloc都不会对申请的内存做初始。 可以通过kzalloc或vzalloc申请内存并初始化为0。 1.3. 对齐 kmalloc按块分配,通常为2^n对齐,每次分配的大小也是2^n。根据实现,可能也支持96或者192字节。...

vmalloc原理

1. 全局数据结构 1/// mm/vmalloc.c 2/* Export for kexec only */ 3LIST_HEAD(vmap_area_list); 4static struct rb_root vmap_area_root = RB_ROOT; 5/// ... ... 6 7/* 8 * This kmem_cache is used for vmap_area objects. Instead of 9 * allocating from slab we reuse an object from this cache to 10 * make things faster. Especially in...

kmalloc分配内存的大小(基于linux-5.15)

1. kmalloc分配内存的大小 本文基于linux-5.15分析,linux-6.6已经删除slob,后续也会将slab移除。 kmalloc会根据申请的内存大小来决定来决定使用块分配器(slab/slub/slob)或页分配器进行内存分配。 控制kmalloc分配行为的主要有如下三个宏。 macro desc KMALLOC_MAX_SIZE kmalloc可以分配的最大内存,超过此大小时返回NULL KMALLOC_MAX_CACHE_SIZE kmalloc使用slab分配器分配的最大内存,超过此大小后会通过伙伴系统分配页 KMALLOC_MIN_SIZE kmalloc可以分配的最小内存,小于此大小时,kmalloc内...

内存管理API汇总

1. 总览 如下为内核开发或驱动开发常见的内存管理API关系,其他如CMA分配器等相关API未列出。 1.1. 框架图 1.2. 函数图总览 2. memblock分配器 memblock分配器主要用于Linux启动时的内存分配,被memblock_alloc分配后未被释放的内存,不会被加入到页管理器中。 api param desc memblock_alloc size, align size表示要申请的大小,align表示内存对齐大小 3. 页分配器 页分配器相关的函数或宏在include/linux/gfp.h中声明。常用的函数如下: return api param unsigned long...

为什么要有idmap

要开启MMU,需要建立页表映射,而且需要处理缓存一致性的问题,这样内核启动的依赖条件就会变得复杂。为了降低启动代码的复杂度,约定在Linux内核启动时,MMU是关闭的。这样也就意味着不能利用高速缓存的性能。为了获得更好的性能,也为了后续可以给不同的地址空间设置不同的访问属性以更好地管理内存,需要在某个阶段把MMU打开,并使能高速缓存。 但是,在关闭MMU的情况下,处理器访问的是物理地址,而MMU打开时,处理器访问的地址变成了虚拟地址。现代处理器大多数是多级流水线架构,处理器会提前预取多条指令到流水线中。打开MMU只需要向SCTLR_ELx寄存器写入特定值即可,运行到此处时,处理器已经提前预取了多条指令,这些指令要操作的地址实际是物理...