在 start_kernel 函数中,linux 内核的初始化会通过调用 proc_caches_init 函数来为内核对象分配和初始化 slab 缓存描述符。这个函数主要在 fork.c 文件中定义。初始化过程中,会使用 kmem_cache_create 函数来为不同类型的 SLAB 缓存区域进行分配,包括 sighand_cachep、signal_cachep、files_cachep、fs_cachep、mm_cachep 和 vm_area_cachep。对于 mm_cachep 缓存空间,会在 mm_struct 结构上进行分配。对于 vm_area_struct 结构,会为其分配 vm_area_cachep 缓存空间。在初始化过程中,还涉及了 mmap_init 和 nsproxy_cache_init 函数的调用,分别用于初始化虚拟内存区域的 Slab 和名称空间的 slab。
slab 是 linux 内核中的小内存分配器,它用于分配小内存,主要使用在 linux 内核的对象不需要使用内存页面分配方式的情况。在 slab 中分配内存的第一步是创建 slab 描述符,proc_caches_init 函数的目的是创建这些描述符。关于 slab 分配器的详细内容将在后续的 linux 内核内存管理文章中进行深入探讨。
往期文章精选: