作业信息
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析)> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第七周作业> |
这个作业的目标 | <进程的描述,进程的创建,跟踪分析进程创建的过程,总结> |
作业正文 | ... 本博客链接 |
进程的描述和创建
1.进程的描述
-
操作系统内核三大管理功能:进程管理,内存管理和文件系统,对应操作系统原理最重要的3个概念:进程,虚拟内存和文件。其中,操作系统内核最核心的功能是进程管理。
-
进程有就绪态,运行态,阻塞态3种基本状态。
-
在Linux内核中用一个数据结构struct task_struct来描述进程,struct task_struct的数据结构非常庞大,包含进程的状态,进程双向链表的管理,以及控制台tty,文件系统fs的描述,进程打开文件的文件描述符files,内存管理的描述mm,还有进程间通信的信号signal的描述等。
2.进程的创建
-
(1)进程的创建是非常复杂的,init_task(0号进程)通过kernel_thread创建了两个内核线程:一个是kernel_init,最终把用户态的进程init给启动起来;另一个是kthread内核线程。kthreadd内核线程是所有内核线程的祖先,负责管理所有内核线程。kthreadd创建进程的过程和shell命令行下启动一个进程时创建进程的过程在本质上是一样的,都要通过复制父进程来创建一个子进程。在系统启动时,除了0号进程的初始化过程是手工编码创建的之外,1号init进程的创建实际上是复制0号进程,根据1号进程的需要修改了进程pid,然后再加载一个init可执行程序。同样的,2号kthreadd内核线程也是通过复制0号进程来创建的。
-
(2)fork,vfork和clone这3个系统调用和kernel_thread内核函数都可以创建一个新进程,而且都是通过do_fork函数来创建进程的,只不过传递的参数不同。
-
(3)do_fork的参数:
-
i: do_fork主要完成了调用copy_process复制父进程信息、获得pid、调用wake_ip_new_task将子进程加入调度器队列等待获得分配CPU资源运行、通过clone_flags标志做一些辅助工作。
-
ii: copy_process函数主要完成了调用dup_task_struct复制当前进程(父进程)描述符task_struct、信息检查、初始化、复制所有其他进程资源、调用copy_thread初始化子进程内核栈、设置子进程pid等。其中最关键的就是dup_task_struct复制当前进程描述符task_struct和copy_thread初始化子进程内核栈。
-
iii: dup_task_struct函数中为子进程分配好了内核栈,copy_thread完成内核栈关键信息的初始化。
3.跟踪分析进程创建的过程
在MenuOS里面增加一个命令fork
启动gdb准备跟踪调试内核程序
在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread,ret_from_fork处设置断点
执行“C”,依次对断点进行跟踪
4.总结
进程的创建过程大致是复制进程描述符、一一复制其它进程资源(采用写时复制技术)、分配子进程的内核堆栈并对内核堆栈关键信息进行初始化。