start_kernel——mm_init_owner

来源:互联网 发布:国内旅游市场数据 编辑:程序博客网 时间:2024/04/30 13:52

所有任务都具有自己的内存,启动阶段中的当前任务必须具备属于自己的内存。
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_OWNERvoid 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的拥有者。


0 0