mm-buddy_allocator_page_allocation-2

如果 __alloc_pages_nodemask 调用 get_page_from_freelist 没有申请到内存页,就会屏蔽掉传递的 gfp 中的 __GPF_IO 标志,调用 __alloc_pages_slowpath 申请内存。 1. __alloc_pages_slowpath 和 __alloc_pages_nodemask 不同, slowpath 不会对 alloc_flags 设置较多限制,而是尽可能的满足分配请求,

mm-slab_object_free

本文仍然以slab cache kmalloc_caches 为例,结合 kfree 函数的实现,说明slab对象的回收过程。 1. kfree 通过 kfree 函数释放 kmalloc 申请的内存时,对应的函数定义在 mm/slub.c 中。 1 2 3 4 5

mm-slab_object_allocation

slab cache建立后,就可以从中分配对象。以 kmalloc_caches 为例,执行 kmalloc 函数时会从中分配对象。 1. kmalloc 搞内核的肯定对 kmalloc 不会陌生,和 malloc 函数类似,这个函数用来分配内

mm-slab_initialization

SLAB 用来响应较小的内存分配请求,事实上,现在的 Linux 内核使用的是 SLUB —— unqueued SLAB 分配器。 Linux 内核支持三种分配器,分别为 SLAB , SLOB , SLUB 。 x86 架构下,默认采用 SLUB 分配

mm-buddy_allocator_initialization

在介绍伙伴系统之前,我们先看一下伙伴系统所需要的数据结构的初始化流程。 伙伴系统使用的数据结构主要有每个内存节点的内存信息和每个内存区域的内存

mm-buddy_allocator_page_allocation-1

slab 系统调用 buddy 分配器分配所需要的内存页,作为 slab 使用。 和 slab 系统不同, buddy 系统主要响应较大 ( 至少为一个内存页 ) 的内存分配请求,本文仍然从 kmalloc 函数的实现

mm-mem_section

本文从 Linux 内核的内存管理关键的数据结构出发,结合内核源码中的注释,说明 Linux 的内存管理用到的数据结构的初始化流程。本文以 x86-64 架构为例,假设系统类型为