本文共 5096 字,大约阅读时间需要 16 分钟。
start_kernel()---->rest_init()
rest_init的定义如下:
371 static void noinline rest_init(void) 372 __releases(kernel_lock) 373 { 374 kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND); //进程的入口函数是init函数 375 printk(KERN_ERR "tom rest_init=%x",init); 376 numa_default_policy(); 377 unlock_kernel(); 378 preempt_enable_no_resched(); 379 cpu_idle(); 380 }
在kernel_thread的参数:
fn: 函数入口 arg: flags:297 int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) 298 { 299 if(flags==(CLONE_FS | CLONE_SIGHAND)) 300 printk(KERN_ERR "tom kernel_thread\n"); 301 struct pt_regs regs; 302 303 memset(®s, 0, sizeof(regs)); 304 305 regs.ebx = (unsigned long) fn; 306 regs.edx = (unsigned long) arg; 307 308 regs.xds = __USER_DS; 309 regs.xes = __USER_DS; 310 regs.orig_eax = -1; 311 regs.eip = (unsigned long) kernel_thread_helper; 312 regs.xcs = __KERNEL_CS; 313 regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2; 314 315 /* Ok, create the new process.. */ 316 return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, ®s, 0, NULL, NULL);317 }
134 static struct task_struct *dup_task_struct(struct task_struct *orig) 135 { 136 if ( !strcmp(orig->comm, "swapper")) 137 printk(KERN_ERR "tom dup_task_struct\n"); 138 struct task_struct *tsk; 139 struct thread_info *ti; 140 141 prepare_to_copy(orig); 142 143 tsk = alloc_task_struct(); 144 if (!tsk) 145 return NULL; 146 147 ti = alloc_thread_info(tsk); 148 if (!ti) { 149 free_task_struct(tsk); 150 return NULL; 151 } 152 153 *ti = *orig->thread_info; 154 *tsk = *orig; 155 tsk->thread_info = ti; 156 ti->task = tsk; 157 158 /* One for us, one for whoever does the "release_task()" (usually parent) */ 159 atomic_set(&tsk->usage,2); 160 return tsk; 161 }
转载地址:http://gafab.baihongyu.com/