前一篇文章讲到内核如何提供/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,