我们接下来要说的初始化函数是创建进程的相关初始化fork_init(),下面我们来仔细分析一下它的代码吧
void __init fork_init(unsigned long mempages)//mempages这个参数一般是指实际存在的物理内存总页数。
{
#ifndef __HAVE_ARCH_TASK_STRUCT_ALLOCATOR//ARM没有定义这个的
#ifndef ARCH_MIN_TASKALIGN//ARM是没有定义这个的
#define ARCH_MIN_TASKALIGN L1_CACHE_BYTES//放置struct task_struct结构体的位置的最小对齐方式为处理器的cache line 大小。
#endif
/* create a slab on which task_structs can be allocated */
task_struct_cachep =
kmem_cache_create("task_struct", sizeof(struct task_struct),
ARCH_MIN_TASKALIGN, SLAB_PANIC, NULL, NULL);//task_struct_cachep是一个全局变量,它指向一个告诉缓存,在我们看来这个高速缓存的每个对象都好像是sizeof(struct task_struct)这样的大小。说明这个高速缓存专门用来存放struct task_struct结构体的。同时也是要求了对齐方式。
#endif
/*
* The default maximum number of threads is set to a safe
* value: the thread structures can take up at most half
* of memory.
*/
max_threads = mempages / (8 * THREAD_SIZE / PAGE_SIZE);//其实就是物理内存总页数/每一个线程所占页数/8,就是说最都只可以用到系统内存总页数的1/8来存放线程结构体。这里就是用最大限度的空间来存放结构体统计出来的数量。
/*
* we need to allow at least 20 threads to boot a system
*/
if(max_threads < 20)
max_threads = 20;
init_task.signal->rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;//将0号进程的信号描述结构体中的进程数资源限制的当前值设置为max_threads/2。
init_task.signal->rlim[RLIMIT_NPROC].rlim_max = max_threads/2;//将0号进程的信号描述结构体中的进程数资源限制的最大值值设置为max_threads/2。
}
其实这里就是创建进程前先创建struct task_struct高速缓存,同时还要统计系统至少可以支持多少个进程。
接下来要介绍的函数就是为进程管理的相关数据结构创建高速缓存内存proc_caches_init()
void __init proc_caches_init(void)
{
sighand_cachep = kmem_cache_create("sighand_cache",
sizeof(struct sighand_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为信号处理描述结构体申请高速缓存
signal_cachep = kmem_cache_create("signal_cache",
sizeof(struct signal_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为信号描述结构体申请高速缓存
files_cachep = kmem_cache_create("files_cache",
sizeof(struct files_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为进程打开的文件表描述结构体申请高速缓存
fs_cachep = kmem_cache_create("fs_cache",
sizeof(struct fs_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为进程的文件系统信息的描述结构体申请高速缓存
vm_area_cachep = kmem_cache_create("vm_area_struct",
sizeof(struct vm_area_struct), 0,
SLAB_PANIC, NULL, NULL);//这里是为线性内存区域的描述结构体申请高速缓存
mm_cachep = kmem_cache_create("mm_struct",
sizeof(struct mm_struct), 0,
SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL, NULL);//这里是为内存描述结构体申请高速缓存
}
到这里我们已经完成了内存管理的相关初始化。