zoukankan      html  css  js  c++  java
  • 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的拥有者。


  • 相关阅读:
    (笔记)Mysql命令mysqldump:备份数据库
    (笔记)Mysql命令rename:修改表名
    (笔记)Mysql命令alter add:增加表的字段
    (笔记)Mysql命令update set:修改表中的数据
    (笔记)Mysql命令delete from:删除记录
    (笔记)Mysql命令select from:查询表中的数据(记录)
    psutil库
    生成器 yield
    高阶函数map(),filter(),reduce()
    logging模块
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7211868.html
Copyright © 2011-2022 走看看