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
- start_kernel——mm_init_owner
- start_kernel——boot_init_stack_canary
- start_kernel——local_irq_disable
- start_kernel——page_address_init
- start_kernel——setup_nr_cpu_ids
- start_kernel——setup_per_cpu_areas
- start_kernel——boot_cpu_init及PER_CPU
- start_kernel
- start_kernel
- start_kernel
- start_kernel
- start_kernel
- start_kernel
- start_kernel()
- <Linux>Linux内核启动分析(二)——start_kernel
- 内核启动的C语言阶段——start_kernel函数
- arm linux 从入口到start_kernel 代码分析——head.S分析——1
- arm linux 从入口到start_kernel 代码分析——head.S分析——2
- Android开发——自动连接指定SSID的wifi热点(不加密/加密)
- ANDROID内存优化(大汇总——全)
- ubuntu中安装jdk
- centos安装ssh免密码登录
- Linux Sendfile 的优势
- start_kernel——mm_init_owner
- 2015年最火爆招商!云收单!云支付!合冠泓诚招全国分销商
- VS2008远程调试
- 教你识別和区分网络及使用者
- MongoDB运行状态、性能监控,分析
- OSG 自带examples简介
- 如何编写批处理文件
- 博客地址记录
- java中i++问题的理解