版本2.6.23
摘自https://elixir.bootlin.com/linux/v2.6.23/source/kernel/fork.c#L959
文字描述
1.调用 dup_task_struct 复制当前的 task_struct
2.检查进程数是否超过限制
3.初始化自旋锁、挂起信号、CPU 定时器等
4.调用 sched_fork 初始化进程数据结构,并把进程状态设置为 TASK_RUNNING
5.复制所有进程信息,包括文件系统、信号处理函数、信号、内存管理等
6.调用 copy_thread 初始化子进程内核栈
7终止并返回子进程描述符指针
原文链接:https://blog.csdn.net/tiankong_/java/article/details/76190708
copy_process()源码 2.6.23
1 | static struct task_struct *copy_process(unsigned long clone_flags, |
task_struct源码 2.6.23
task_struct 定义
1 | struct task_struct { |
pid 定义
1 | struct pid |
copy_mm(),mm_struct有关
copy_process其中最重要的是 copy_mm() ,该函数通过建立新进程所有页表和内存描述符来创建进程地址空间;
1 | struct mm_struct |
dup_mm()
调用dup_mmap(mm, oldmm);
1 | static struct mm_struct *dup_mm(struct task_struct *tsk) |
dup_mmap()
复制父进程每个 vm_area_struct 线性区描述符,插入到子进程的线性区链表和红黑树中;
1 | struct vm_area_struct |