start_kernel——mm_init_owner

原创 2015年07月06日 17:49:46

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


mm_init分析(Zoned Buddy Allocator)

1 mm_init分析file:init/main.cstart_kernel函数{ ... setup_arch(&command_line);//处理器相关的初始化代码,paging_init,详...
  • huyugv_830913
  • huyugv_830913
  • 2010年09月15日 21:36
  • 3482

Kernel启动流程源码解析 8 mm_init

一 mm_init 1.0 mm_init 定义在init/main.c中 static void __init mm_init(void) {     /*      * page_cgr...
  • xichangbao
  • xichangbao
  • 2016年11月22日 19:18
  • 686

主程序mm.c和初始化程序init.c

  • 2013年10月14日 00:10
  • 1KB
  • 下载

启动期间的内存管理之bootmem_init初始化内存管理--Linux内存管理(十二)

日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Linux-4.7 X86 & arm gatieme LinuxDeviceDrive...
  • gatieme
  • gatieme
  • 2016年09月01日 22:23
  • 2267

内存管理之函数mm_init解读之mem_init

linux kernel000000000000
  • sunlei0625
  • sunlei0625
  • 2017年02月28日 19:29
  • 889

Kernel启动流程源码解析 4 start_kernel 上

一 start_kernel start_kernel函数是kernel启动过程执行的第一个c语言函数,其通过调用一系列初始化函数完成的内核的初始化工作,上篇分析local_irq_en...
  • xichangbao
  • xichangbao
  • 2016年10月21日 23:47
  • 954

Arm-linux内存管理(4)

摘于毛德操《嵌入式系统》 上一篇主要是与具体体系有关的数据结构,并最后遗留了个问题: 那么,这些数据结构怎样发挥作用的呢?特别是,ARM-Linux内核怎样根据这些数据结构建立起地址映射呢? ...
  • tianxiawuzhei
  • tianxiawuzhei
  • 2012年05月06日 20:17
  • 2132

linux 内存地址空间管理 mm_struct

Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起。(所依据的代码是2.6.32.60) 无论是内核线程还是用户进程,对于内核来说,无非都是task_struct...
  • yusiguyuan
  • yusiguyuan
  • 2014年09月24日 11:14
  • 1667

arm-linux内核start_kernel之前启动分析(1)-接过bootloader的衣钵

如果想运行和链接地址不一致,我能想到的办法,只能是汇编中尽量不去涉及一些绝对地址,使用PIC位置无关代码。 联想之前分析的uboot relocation原理,uboot在relocation之后,k...
  • skyflying2012
  • skyflying2012
  • 2014年11月21日 10:05
  • 9557

利用gdb分析从start_kernel到init启动的过程

徐晨 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ” 今天我们分析一下L...
  • umika
  • umika
  • 2016年03月13日 23:05
  • 1002
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:start_kernel——mm_init_owner
举报原因:
原因补充:

(最多只允许输入30个字)