内核RSS内存占用的代码记录

前一篇文章讲到内核如何提供/proc/$pid/stat这个数据的,这属于内核proc文件系统的基础实现流程。

而其中的RSS到底是一个什么值,内存管理模块在哪里更新RSS的数据的。举一个例子看一下。

典型的就是我们fork进程或者clone线程的时候,fork系统调用的入口如下。会调用kernel_clone接口。

SYSCALL_DEFINE0(fork)
{
#ifdef CONFIG_MMU
	struct kernel_clone_args args = {
		.exit_signal = SIGCHLD,
	};

	return kernel_clone(&args);
#else
	/* can not support in nommu mode */
	return -EINVAL;
#endif
}

kernel_clone接口会一直调用至dup_mmap接口,将父进程的页表拷贝给子进程。线程是复用主线程的mm_struct的,所以线程应该不会有copy_page_range的操作。

那只有进程才会触发copy_page_range。

kernel_clone
  ->copy_process
    ->copy_mm
      ->dup_mm
        ->dup_mmap

		if (!(tmp->vm_flags & VM_WIPEONFORK)) //没有使能这个标识
			retval = copy_page_range(tmp, mpnt);  //则拷贝页表

copy_page_range接口会依次遍历每一级页表,完成拷贝。在最后一级copy_pte_range接口中的实现如下。

copy_pte_range(struct vm_area_struct *dst_vma, struct vm_area_struct *src_vma,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值