进程控制模块分析文档初稿
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
进程控制模块分析
一、模块名称:
进程控制模块,在linux体系结构中属于用户接口层。
二、模块功能描述:
进程控制模块,主要负责:
1 进程的运行控制包括创建,注销,停止。
2 进程的信息管理,包括命名空间管理,PID管理。
3 进程的资源管理。
三、模块结构图:
四、模块接口说明:
1接口名: 获得进程的数字ID
接口的功能描述:得到进程在给定命名空间,指定类型的数字ID号。
接口包含的函数:
1)pid_t task_pid_nr_ns(structtask_struct *tsk
structpid_namespace *ns)
●入口参数:
a)structtask_struct*tsk:需要查询的进程的描述
符。
b)structpid_namespace *ns:需要查询的进程所
在的命名空间。
●返回值:
a)pid_t:需要查询的进程的数字pid号。
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。详细介绍见模
块主要结构体说明。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
根据进程描述符,获得在制定命名空间的进程数字
pid。
2)pid_t task_tgpid_nr_ns(structtask_struct*tsk
structpid_namespace *ns)
●入口参数:
a)structtask_struct*tsk
b)structpid_namespace*ns
●返回值:pid_t: 进程的数字ID号定义为int类型。
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。详细介绍见模
块主要结构体说明。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
根据进程描述符,获得在制定命名空间的进程组
的数字pid。
3)pid_t task_pgrp_nr_ns(structtask_struct *tsk
structpid_namespace*ns
●入口参数:
a)structtask_struct *tsk
b)structpid_namespace *ns
●返回值:pid_t
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
得到进程在命名空间ns的进程组号(pgrp)。
4)pid_t task_session_nr_ns(structtask_struct *tsk
structpid_namespace*ns
●入口参数:
a)structtask_struct*tsk
b)structpid_namespace *ns
●返回值:pid_t: 进程在命名空间ns的会话ID号(SID.)
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
得到进程在命名空间ns的会话ID号(SID)。
2接口名: 根据pid号和指定命名空间,查询进程描述符。
接口的功能描述:得到进程在给定命名空间,给定ID号时的进程描述符。
接口包含的函数:
1)pid_t find_task_by_pid_ns(pid_t nr,
structpid_namespace*ns)
●入口参数:
a)pid_t nr
b)structpid_namespace*ns
●返回值:structtask_struct
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。
b)pid_t:进程的数字ID号定义为int类型。
c)pid_namespace pid命名空间的结构体。
●函数说明
得到进程在给定命名空间,给定ID号时的进程描述符。
2)structtask_struct find_task_by_vpid(pid_t vnr)
●入口参数:
a)pid_t vnr
●返回值:structtask_struct
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
通过局部数字PID号查询进程描述符。
3)pid_t find_task_by_vpid(pid_t nr)
●入口参数:
a)pid_t nr
●返回值:pid_t
●重要的结构体说明:
a)task_struct:存储的了进程的各种控制信息,
详细定义参见重要数据结构。
b)pid_t:进程的数字ID号定义为int类型。
●函数说明
得通过全局数字PID号查询进程描述符。
3接口名: 生成进程PID
接口的功能描述:得到进程在给定命名空间,给定ID号时的进程描述符。
接口包含的函数:
1)struct* pid alloc_pid(structpid_namespace*ns)
●入口参数:
a)structpid_namespace*ns:命名空间的结构体
●返回值:struct* pid : pid管理数据结构。
●重要的结构体说明:
a)struct* pid: pid管理数据结构。
b)pid_namespace:pid命名空间的结构体。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用“内存管理模块:kmem_cache_alloc()”接口。
2)将会被“进程控制模块:进程创建”接口调用。
3)调用“进程控制模块的:task_struct“。
4接口名:设置进程状态:
接口包含的函数:
1)void set_task_state(Structtask_struct*tsk ,int state)
●入口参数:
a)Structtask_struct*tsk:要设置的进程的进程描述符
b)int state:要设置的进程状态。
●返回值:
void
●函数说明:
该函数是实际上是一段宏定义的内联汇编将tsk的state成员变量赋值为入口参数state。
与其他接口的调用的动态关系:
1)调用”进程控制模块的:task_struct“。
5接口名设置进程状态:
接口包含的函数:
1)void set_current_state(Structtask_struct*tsk ,int state)
●入口参数:
a)Structtask_struct*tsk:要设置的进程的进程描述符
b)int state:要设置的进程状态。
●返回值:
void
●函数说明:
该函数是实际上是一段宏定义的内联汇编将tsk的state成员变量赋值为入口参数state。
与其他接口的调用的动态关系:
1)调用”进程控制模块的:task_struct“。
6接口名:sys_fork()
接口的功能描述:为当前进程创建一子进程。子进程只是完全复制父进程的资源,复制出来的子进程有自己的task_struct结构和pid,但却复制父进程其它所有的资源。函数定义在
\linux\arch\ia64\kernel\process.c中
接口包含的函数:
1)int sys_fork(structpt_regs*regs)
●入口参数:
a)structpt_regs*regs:用户态下的CPU寄存器
在核心态的栈中的保存情况。
●返回值:
a)Int: 进程创建的结果,详情请见本模块的结
构体和宏的说明部分。。
●重要的结构体说明:
a)structpt_regs*regs:该结构体描述了在执行
系统调用时,用户态下的CPU寄存器在核心
态的栈中的保存情况。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用“进程控制模块:do_fork()”接口。
7接口名:sys_vfork()
接口的功能描述:为当前进程创建一子进程。用vfork创建的子进程与父进程共享地址空间,也就是说子进程完全运行在父进程的地址空间上,如果这时子进程修改了某个变量,这将影响到父进程。函数定义在\linux\arch\ia64\kernel\process.c中
接口包含的函数:
1)int sys_vfork(structpt_regs*regs)
●入口参数:
a)structpt_regs*regs:用户态下的CPU寄存器
在核心态的栈中的保存情况。
●返回值:
a)Int: 进程创建的结果,详情请见本模块的结
构体和宏的说明部分。。
●重要的结构体说明:
a)structpt_regs*regs:该结构体描述了在执行
系统调用时,用户态下的CPU寄存器在核心
态的栈中的保存情况。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用“进程控制模块:do_fork()”接口。
8接口名:sys_clone()
接口的功能描述:clone()将父进程资源有选择地复制给子进程,而没有复制的数据结构则通过指针的复制让子进程共享,具体
要复制哪些资源给子进程,由参数列表中的clone_flags来决定。
另外,clone()返回的是子进程的pid。函数定义在
\linux\arch\ia64\kernel\process.c中
接口包含的函数:
1)long sys_clone(unsigned long clone_flags,
unsigned long newsp,
void __user *parent_tid,
void __user *child_tid,
structpt_regs *regs)
●入口参数:
a)unsigned long clone_flags:创建进程的标志,
详情请见本模块的结构体和宏的说明部分。
b)unsigned long newsp:新用户栈的指针。
c)void __user *parent_tid:父进程的PID。
d)void __user *child_tid: 子进程的PID。
e)structpt_regs*regs:用户态下的CPU寄存器
在核心态的栈中的保存情况。
●返回值:
a)long: 进程创建的结果,详情请见本模块的结
构体和宏的说明部分。
●重要的结构体说明:
a)structpt_regs*regs:该结构体描述了在执行
系统调用时,用户态下的CPU寄存器在核心
态的栈中的保存情况。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用“进程控制模块:do_fork()”接口。
9接口名:do_fork()
接口的功能描述:创建一个进程。
接口包含的函数:
1)long do_fork(unsigned long clone_flags,
unsigned long stack_start,
structpt_regs *regs,
unsigned long stack_size,
int __user *parent_tidptr,
int __user *child_tidptr
)
●入口参数:
a)unsigned long clone_flags:创建进程的标志,
详情请见本模块的结构体和宏的说明部分。
b)unsigned long stack_start:用户栈的起始地址。
c)structpt_regs*regs:用户态下的CPU寄存器
在核心态的栈中的保存情况。
d)unsigned long stack_size:用户栈的大小。
e)int __user *parent_tidptr:父进程的PID。
f)int __user *child_tidptr:子进程的PID。
●返回值:
a)long:进程创建的结果,详情请见本模块的
结构体和宏的说明部分。
●重要的结构体说明:
a)structpt_regs*regs:该结构体描述了在执行
系统调用时,用户态下的CPU寄存器在核心
态的栈中的保存情况。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用“内存管理模块:kmem_cache_alloc()”接口。
2)将会调用“调试模块的:ptrace_event()接口”。
3)将会调用”进程管理模块:进程调度模块:sched_fork()接口”。
4)调用“进程控制模块的:task_struct“。
10接口名: 启动程序
接口的功能描述:从磁盘上启动新的程序。
接口包含的函数:
1)int do_execve(const char *filename,
const char __user *const __user *__argv:命令行
变量地址。
const char __user *const __user *__envp:环境变
量地址。
structpt_regs *regs
)
●入口参数:
a)const char *filename:可执行的文件的文件名。
b)const char __user *const __user *__argv,
c)const char __use r *const __user *__envp,
d)structpt_regs *regs:用户态下的CPU寄存器
在核心态的栈中的保存情况。
●返回值:int:载入结果标识。
●重要的结构体说明:
a)structpt_regs*regs:该结构体描述了在执行
系统调用时,用户态下的CPU寄存器在核心
态的栈中的保存情况。
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用”内存管理模块:kmem_cache_alloc()接口”。
2)将会调用”文件系统模块:file_open接口”。
3)调用“进程控制模块的:task_struct“。
11接口名: 进程退出
接口的功能描述:从磁盘上启动新的程序。
接口包含的函数:
1)void do_exit(long code)
●入口参数:
a)long code
●返回值:
void
●函数说明:
函数的具体流程是:
与其他接口的调用的动态关系:
1)将会调用”调试模块:ptrace_event()”接口。
2)将会调用”进程调度模块:schedule()”接口。
3)将会调用“计时器模块del_timer_sync()”接口。
4)将会调用“审计模块:acct_update_integrals()”接口。
5)将会调用“内存管理模块:exit_mm()”接口。
6)将会调用“进程通信模块:sem_exit()”接口。
7)将会调用“进程通信模块:sem_exit()”接口。
8)将会调用“文件系统:exit_files()”接口。
9)调用“进程控制模块的:task_struct“。
五、模块内部实现机制:
1 do_fork接口会调用alloc_pid接口。
2 sys_fork接口会调用do_fork接口。
3 sys_vfork接口会调用do_fork接口。
4 sys_clone接口会调用alloc_pid接口。
六、编译时依赖的模块:
内存管理模块,进程调度模块,文件系统模块,调试模块。
七、重要数据结构说明:
1task_struct
a)定义位置:linux\include\sched.h
b)结构体描述:储存了进程控制需要的所有信息。
c)对外提供的接口: