全部任务都具有自己的内存,启动阶段中的当前任务必须具备属于自己的内存。
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的拥有者。
时间: 2024-12-08 22:43:11