20135337朱荟潼 Linux第六周学习总结——进程的描述和进程的创建

本文深入解析Linux内核中进程的描述及创建过程,包括进程控制块task_struct的作用、进程状态及如何通过fork函数创建新进程,并详细介绍了复制父进程PCB、分配内核堆栈以及修改进程数据的具体步骤。

朱荟潼 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课http://mooc.study.163.com/course/USTC 1000029000

第六周 进程的描述和进程的创建

一、 进程的描述

1、 进程控制块PCB——task_struct

1.操作系统的三大管理功能包括

进程管理
内存管理
文件系统

2.PCB task_struct中包含

进程状态
进程打开的文件
进程优先级信息

3.通过唯一的进程标识PID来区别每个进程。

4.进程状态
744834-20160329140725676-1733911172.jpg

5.理解task_struct数据结构
744834-20160329140740410-1755332729.png
744834-20160329140747363-1889949903.png
744834-20160329140753629-688284379.png
744834-20160329140800582-1064317661.png

二、 进程的创建

744834-20160329140841082-1838200050.png

1.分析fork函数。
744834-20160329141150644-493259539.png

2.创建一个新进程

通过调用fork()来创建一个新进程----->通过复制当前进程来实现的------>先复制一个PCB——task_struct------>再给新进程分配一个新的内核堆栈------>修改复制过来的进程数据(如pid、进程链表等)

744834-20160329140955379-1109048353.png

3.新进程执行起点:return_from_fork,只复制了内核堆栈一部分,int指令和save_all压到内核栈的内容,参数、系统调用号等都进行压栈。

三、实践

使用gdb跟踪创建新进程

744834-20160329141008738-653643868.png
744834-20160329141016894-443956370.png
由于虚拟机是32位转化为64位发生溢出现象。

744834-20160329141031676-232184233.png
744834-20160329141043754-221674483.png

总结

创建一个新进程在内核中的执行过程

1.使用系统调用clone、fork、vfork均可创建一个新进程,但都是通过调用do_fork来实现进程的创建;
2.复制父进程PCB--task_struct来创建一个新进程,要给新进程分配一个新的内核堆栈;
3.修改复制过来的进程数据,比如pid、进程链表等等执行copy_process和copy_thread
4.p->thread.sp = (unsigned long) childregs; //调度到子进程时的内核栈顶
  p->thread.ip = (unsigned long) ret_from_fork; //调度到子进程时的第一条指令地址

转载于:https://www.cnblogs.com/zzzz5/p/5330144.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值