首页 > 代码库 > start_kernel——mm_init_owner

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的拥有者。


<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

start_kernel——mm_init_owner