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


时间: 2024-12-08 22:43:11

start_kernel——mm_init_owner的相关文章

arm linux 启动之二:start_kernel到创建1号进程

本文介绍arm linux启动的第二部分,C语言编写,主要讲述start_kernel到1号进程的创建.主要讲述大概过程,以后再对子函数进行讲解. 一.start_kernel start_kernel位于init/main.c,主要完成linux一些子系统的初始化. 1)smp_setup_processor_id() 单CPU位为空. 2)lock_kernel() 锁CPU,linux是支持抢占的,多CPU时调用这个函数防止其他CPU抢占.3)tick_init() 时间相关初始化4)bo

(转)start_kernel 代码分析

head-common.S---具体做了哪些动作---跳转到init/main.c ---b start_kernel//关于start_kernel的强文深入理解linux内核,第八章main.casmlinkage void __init start_kernel(void){char * command_line;extern struct kernel_param __start___param[], __stop___param[];//来设置smp process id,当然目前看到

Linux学习之源码2:start_kernel流程

一.X86的流程可以参考http://www.kerneltravel.net/kernel-book/第十三章%20启动系统/13.5.htm 二.arm的流程,在http://www.cnblogs.com/gangsaleisi/archive/2013/01/09/2851734.html基础上进行分析. 并且是在3.9.7版本上进行分析的,差别不是太大. 1.lockdep_init():lockdep哈希表初始化,lockdep是linux内核的一个调试模块,用来检查内核互斥机制尤其

理解start_kernel中函数语句的作用

asmlinkage void __init start_kernel(void) { char * command_line; extern const struct kernel_param __start___param[], __stop___param[]; /*这两个变量为地址指针,指向内核启动参数处理相关结构体段在内存中的位置(虚拟地址). 声明传入参数的外部参数对于ARM平台,位于 include\asm-generic\vmlinux.lds.h*/ /* * Need to

(作业3)Linux内核的启动过程(从start_kernel到init进程启动)

作业题目: 详细分析从start_kernel到init进程启动的过程并结合实验截图撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下: 题目自拟,内容围绕Linux内核的启动过程,即从start_kernel到init进程启动: 博客中需要使用实验截图 博客内容中需要仔细分析

Linux内核分析-使用gdb跟踪调试内核从start_kernel到init进程启动

姓名:江军 ID:fuchen1994 实验日期:2016.3.13 实验指导 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>的童鞋应该是a piece of

linux start_kernel相关进程的思考

退休的贵族进程 0号进程 所有进程的祖先叫做进程0 在系统初始化阶段由start_kernel()函数从无到有手工创建的一个内核线程 进程0最后的初始化工作创建init内核线程,此后运行cpu_idle,成为idle进程 控制权的接力棒从bios-->bootloader-->idle,某种程度上说,就是完成子系统初始化使命后,就退居二线了. 0号进程一直处于皇宫"内核态",没有出过宫"到用户态",所谓贵族终身. 0号进程的代码概要图 进入loop的堆栈

第3阶段——内核启动分析之start_kernel初始化函数(5)

内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数真正理解需要对linux相关体系有很深的了解后才能明白 代码如下: asmlinkage void __init start_kernel(void) { char * command_line; extern struct kernel_param __start___param[], __sto

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程(20135304刘世鹏)

构建一个简单的Linux系统 MenuOs —— start_kernel到init进程 作者:刘世鹏20135304 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核代码简介 内核源码三个个重要目录 arch占有代码量最大,支持不同cpu的源代码,arch/x86目录下的代码是我们关注的重点 init,内核启动相关的代码基本都在init目录下,init/main.c中start_kernel是整