2020-2021-1 20199316《Linux内核原理与分析》第七周作业
2020-2021-1 20199316《Linux内核原理与分析》第七周作业
这个作业属于哪个课程 | <2020-2021-1Linux内核原理与分析> |
---|---|
这个作业要求在哪里 | <2020-2021-1Linux内核原理与分析第七周作业> |
这个作业的目标 | <分析Linux内核创建一个新进程的过程> |
作业正文 | https://www.cnblogs.com/camusxd/p/13997186.html |
一、实验:分析Linux内核创建一个新进程的过程
1、初始化MenuOs,输入fork可以看到menuos触发了一个fork系统调用
2、
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
file linux-3.18.6/vmlinux
target remote:1234
启动gdb调试
在几个函数接口打断点
3、然后进入调试
4、调试结果
例如执行到copy_process()
二、学习知识
1、操作系统内核实现操作系统的三大管理功能:进程管理,内核管理和文件系统,其中最核心的功能是进程管理。
2、在操作系统原理中,我们通过进程控制块PCB描述进程,通常采用一个数据结构struct task_struct来描述进程,其中比较常见的属性如state是进程状态,常见状态有就绪态,运行态和阻塞态。
运行过程如图所示:
内核的第一个进程0号进程iinit_task的进程描述符结构体变量的初始化是通过硬编码方式确定下来的,所有其他的进程都是通过do_fork的方式复制父进程来初始化的。
- 进程的创建
- 用户态创建进程的方法-fork系统调用
fork,vfork,clone 都是通过do_fork()函数创建进程
fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。
fork()函数最大的特点就是被调用一次,返回两次
三、总结
1、 fork,vfork,clone都是linux的系统调用,这三个函数分别调用了sys_fork、sys_vfork、sys_clone,最终都调用了do_fork函数,差别在于参数的传递和一些基本的准备工作不同,主要用来linux创建新的子进程或线程(vfork创造出来的是线程)。
2、问题:clone和fork的区别:
(1) clone和fork的调用方式很不相同,clone调用需要传入一个函数,该函数在子进程中执行。
(2)clone和fork最大不同在于clone不再复制父进程的栈空间,而是自己创建一个新的。 (void *child_stack,)也就是第二个参数,需要分配栈指针的空间大小,所以它不再是继承或者复制,而是全新的创造。