static struct task_struct *dup_task_struct(struct task_struct *orig) { struct task_struct *tsk; //sizeof(task_struct) = 3236;这个值是通过gdb得到的, //可以看到单个的task_struct的大小已经超过了3K,但是系统最开始只为一个进程分配了两页的空间,thread_info在 //页的开始的地方,页的高端地址即是该进程的内核堆栈。thread_info结构体的第一个指针指向其task_struct结构。 struct thread_info *ti; //sizeof(thead_info) = 72 unsigned long *stackend; int node = tsk_fork_get_node(orig); //get node information for about to be created task; //如果使用了NUMA技术,则返回orig中的pref_node_fork字段;否则返回numa_node_id,因为没有定义NUMA所以是0 int err; prepare_to_copy(orig); //arch/x86/kernel/process_32.c:187 :从代码看来这个函数主要以非抢占的方式来设置与FPU相关的东西 //不过,注意这个宏:#define task_thread_info(task) ((stru
内核进程创建之分配task_struct(do_fork->copy_process->dup_task_struct())
最新推荐文章于 2023-03-27 17:30:27 发布
本文详细介绍了Linux内核中进程创建时task_struct和thread_info的分配过程,包括在高速缓存内存上的分配、初始化,以及它们之间的关联建立。重点讨论了task_struct、thread_info与连续内存页面的关系。
摘要由CSDN通过智能技术生成