基于2.6.11内核init进程

1. 流程

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 }   

2. kernel_thread

在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(&regs, 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, &regs, 0, NULL, NULL);
317 } 

dup_task_struct

 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 }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值