Linux 子进程pgd处理

进程创建 fork函数运行。
copy_mm()--> dup_mm
 
static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
 struct user_namespace *user_ns)
{
 mm->mmap = NULL;
 mm->mm_rb = RB_ROOT;
 mm->vmacache_seqnum = 0;
 atomic_set(&mm->mm_users, 1);
 atomic_set(&mm->mm_count, 1);
 init_rwsem(&mm->mmap_sem);
 INIT_LIST_HEAD(&mm->mmlist);
 mm->core_state = NULL;
 atomic_long_set(&mm->nr_ptes, 0);
 mm_nr_pmds_init(mm);
 mm->map_count = 0;
 mm->locked_vm = 0;
 mm->pinned_vm = 0;
 memset(&mm->rss_stat, 0, sizeof(mm->rss_stat));
 spin_lock_init(&mm->page_table_lock);
 mm_init_cpumask(mm);
 mm_init_aio(mm);
 mm_init_owner(mm, p);
 RCU_INIT_POINTER(mm->exe_file, NULL);
 mmu_notifier_mm_init(mm);
 clear_tlb_flush_pending(mm);
#if defined(CONFIG_TRANSPARENT_HUGEPAGE) && !USE_SPLIT_PMD_PTLOCKS
 mm->pmd_huge_pte = NULL;
#endif
 mm_init_uprobes_state(mm);
 if (current->mm) {
  mm->flags = current->mm->flags & MMF_INIT_MASK;
  mm->def_flags = current->mm->def_flags & VM_INIT_DEF_MASK;
 } else {
  mm->flags = default_dump_filter;
  mm->def_flags = 0;
 }
 if (mm_alloc_pgd(mm))
  goto fail_nopgd;
 if (init_new_context(p, mm))
  goto fail_nocontext;
 mm->user_ns = get_user_ns(user_ns);
 return mm;
fail_nocontext:
 mm_free_pgd(mm);
fail_nopgd:
 free_mm(mm);
 return NULL;
}
 
static inline int mm_alloc_pgd(struct mm_struct *mm)
{
 mm->pgd = pgd_alloc(mm);
 if (unlikely(!mm->pgd))
  return -ENOMEM;
 return 0;
}
 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值