start_kernel——mm_init_owner

全部任务都具有自己的内存,启动阶段中的当前任务必须具备属于自己的内存。
mm_init_owner()函数传递init_mm和init_task參数
mm/init-mm.c

struct mm_struct init_mm = {
    .mm_rb      = RB_ROOT,
    .pgd        = swapper_pg_dir,
    .mm_users   = ATOMIC_INIT(2),
    .mm_count   = ATOMIC_INIT(1),
    .mmap_sem   = __RWSEM_INITIALIZER(init_mm.mmap_sem),
    .page_table_lock =  __SPIN_LOCK_UNLOCKED(init_mm.page_table_lock),
    .mmlist     = LIST_HEAD_INIT(init_mm.mmlist),
    INIT_MM_CONTEXT(init_mm)
};

init/init_task.c

/* Initial task structure */
struct task_struct init_task = INIT_TASK(init_task);
EXPORT_SYMBOL(init_task);

include/linux/init_task.h

/*
 *  INIT_TASK is used to set up the first task table, touch at
 * your own risk!. Base=0, limit=0x1fffff (=2MB)
 */
#define INIT_TASK(tsk)  
{                                   
    .state      = 0,                        
    .stack      = &init_thread_info,                
    .usage      = ATOMIC_INIT(2),               
    .flags      = PF_KTHREAD,                   
    .prio       = MAX_PRIO-20,                  
    .static_prio    = MAX_PRIO-20,                  
    .normal_prio    = MAX_PRIO-20,                  
    .policy     = SCHED_NORMAL,                 
    .cpus_allowed   = CPU_MASK_ALL,                 
    .nr_cpus_allowed= NR_CPUS,                  
    .mm     = NULL,                     
    .active_mm  = &init_mm,                 
    .se     = {                     
        .group_node     = LIST_HEAD_INIT(tsk.se.group_node),    
    },                              
    .rt     = {                     
        .run_list   = LIST_HEAD_INIT(tsk.rt.run_list),  
        .time_slice = RR_TIMESLICE,             
    },                              
    .tasks      = LIST_HEAD_INIT(tsk.tasks),            
    INIT_PUSHABLE_TASKS(tsk)                    
    INIT_CGROUP_SCHED(tsk)                      
    .ptraced    = LIST_HEAD_INIT(tsk.ptraced),          
    .ptrace_entry   = LIST_HEAD_INIT(tsk.ptrace_entry),     
    .real_parent    = &tsk,                     
    .parent     = &tsk,                     
    .children   = LIST_HEAD_INIT(tsk.children),         
    .sibling    = LIST_HEAD_INIT(tsk.sibling),          
    .group_leader   = &tsk,                     
    RCU_POINTER_INITIALIZER(real_cred, &init_cred),         
    RCU_POINTER_INITIALIZER(cred, &init_cred),          
    .comm       = INIT_TASK_COMM,               
    .thread     = INIT_THREAD,                  
    .fs     = &init_fs,                 
    .files      = &init_files,                  
    .signal     = &init_signals,                
    .sighand    = &init_sighand,                
    .nsproxy    = &init_nsproxy,                
    .pending    = {                     
        .list = LIST_HEAD_INIT(tsk.pending.list),       
        .signal = {{0}}},                   
    .blocked    = {{0}},                    
    .alloc_lock = __SPIN_LOCK_UNLOCKED(tsk.alloc_lock),     
    .journal_info   = NULL,                     
    .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers),      
    .pi_lock    = __RAW_SPIN_LOCK_UNLOCKED(tsk.pi_lock),    
    .timer_slack_ns = 50000, /* 50 usec default slack */        
    .pids = {                           
        [PIDTYPE_PID]  = INIT_PID_LINK(PIDTYPE_PID),        
        [PIDTYPE_PGID] = INIT_PID_LINK(PIDTYPE_PGID),       
        [PIDTYPE_SID]  = INIT_PID_LINK(PIDTYPE_SID),        
    },                              
    .thread_group   = LIST_HEAD_INIT(tsk.thread_group),     
    .thread_node    = LIST_HEAD_INIT(init_signals.thread_head), 
    INIT_IDS                            
    INIT_PERF_EVENTS(tsk)                       
    INIT_TRACE_IRQFLAGS                     
    INIT_LOCKDEP                            
    INIT_FTRACE_GRAPH                       
    INIT_TRACE_RECURSION                        
    INIT_TASK_RCU_PREEMPT(tsk)                  
    INIT_CPUSET_SEQ(tsk)                        
    INIT_RT_MUTEXES(tsk)                        
    INIT_VTIME(tsk)                         
}

kernel/fork.c

#ifdef CONFIG_MM_OWNER
void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
{
    mm->owner = p;
}
#endif /* CONFIG_MM_OWNER */

仅仅是把init_mm的owner成员指定为init_task,表示init_task是init_mm的拥有者。


原文地址:https://www.cnblogs.com/cxchanpin/p/7211868.html