《Linux内核原理与分析》第七周作业
其他
2018-11-24 17:33:08
阅读次数: 0
课本:第六章 进程的描述和进程的创建
- 操作系统内核实现操作系统的三大管理功能
- 在操作系统原理中,通过进程控制块PCB描述进程;在Linux内核中,通过一个数据结构struct task_struct来描述进程。
- 在操作系统原理中,进程有就绪态、运行态和阻塞态;在Linux内核中,就绪态和运行态都是相同的TASK_RUNNING状态另加上一个阻塞态。在Linux内核中,当进程是TASK_RUNNING状态时,它是可运行的,就是就绪态,是否在运行取决于它有没有获得CPU的控制权。
- 对于一个正在运行的进程,调用用户态库函数exit()会陷入内核执行该内核函数do_exit(),进程会进入TASK_ZOMBIE状态,即中止状态,Linux内核会在适当的时候把该进程处理掉,后释放进程描述符。一个正在运行的进程在等待特定事件或资源时会进入阻塞态,阻塞态分为两种:TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE。前者可以被信号和wake_up()唤醒,后者只能被wake_up()唤醒。进程状态转换图如下图所示:
- 在进程描述符中用pid和tgid标识进程。
- 在进程的创建时,0号进程init_task的初始化是通过硬编码方式固定下来的,除此之外,所有其他进程的初始化都是通过do_fork复制父进程的方式初始化的。
- Linux内核中,数据结构struct thread_struct用来保存进程上下文中CPU相关的一些状态信息,其内部最关键的是sp和ip,在x86-32位系统中,sp用来保存进程上下文中的ESP寄存器状态,ip用来保存进程上下文中的EIP寄存器状态。
- fork系统调用把当前进程又复制了一个子进程,也就一个进程变成了两个进程,两个进程执行相同的代码,只是fork系统调用在父进程和子进程中的返回值不同。
- fork、vfork和clone这三个系统调用和kernel_thread内核函数都可以创建一个新进程,而且都是通过do_fork函数来创建进程的,只不过传递的参数不同。
- do_fork函数的参数:
- clone_flags:子进程创建相关标志,通过此标志可以对父进程的资源进行有选择的复制。
- stack_start:子进程用户态堆栈的地址。
- regs:指向pt_regs结构体的指针。当发生系统调用时,int指令和SAVE_ALL保存现场等会将CPU寄存器中的值按顺序压入内核栈。为了便于访问操作,这部分数据被定义为pt_regs结构体。
- stack_size:用户态栈的大小,通常不必要,设置为0。
- parent_tidptr和child_tidptr:父进程、子进程用户态下的pid地址。
- 进程的创建中几个关键函数:
- do_fork():创建进程
- copy_process():创建进程内容
- dup_task_struct():复制进程描述符、信息检查、初始化、更改进程状态、复制其他进程资源、调用copy_thread初始化子进程内核栈、设置子进程pid等
- copy_thread():内核栈关键信息初始化
实验:分析Linux内核创建一个新进程的过程
转载自www.cnblogs.com/intoxication/p/10012710.html