本文基于 Linux Kernel 2.6.11 分析进程复制系统调用 do_fork函数的实现过程。
详细分析了其中的 copy_process()、dup_task_struct()、copy_file()、copy_mm()、copy_thread()等一系列辅助函数的实现过程。
并详细讲解了进程描述符task_struct、小型进程描述符/内核栈 thread_info、内存描述符mm_struct中的主要字段含义。
讲解了线性区的概念和线性区对象 vm_area_struct、以及线性区数据结构的相关内容。并简单描述了写时拷贝机制的底层实现原理。
进程复制概述
在Linux系统中,进程的产生通常是调用fork系统调用的结果,该系统调用通过复制一个现有的进程来创建一个全新的进程,在调用结束时,在返回点父进程恢复执行,子进程开始执行(执行点就是父进程调用fork()系统调用之后)。
fork函数返回了两次:一次是在父进程,一次是在子进程。如果在子进程中返回,返回值为0;在父进程中返回,返回值是子进程的PID。
执行进程复制在Linux中实现了三种相关的函数:
- fork():