在 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 內核內存管理文章中進行深入探討。
往期文章精選: