2020-2021-1 20209301《Linux内核原理与分析》第七周作业

这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第七周作业>
这个作业的目标 <gdb跟踪调用fork>
作业正文 https://www.cnblogs.com/hyuxin/p/14012994.html

实验六

一、gdb跟踪调用fork函数的过程

1.先删除原有的menu,再在github上克隆一份新的,使用mv把test.c覆盖掉,然后执行编译

2.查看help可以看到多了fork命令

3.跟上次的实验一样,用如下方式调试内核

cd .. #返回到LinuxKernel目录下
qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s 


4.然后在sys_clone,do_fork,dup_task_struct,copy_process,copy_thread和ret_from_fork设置断点:

5.在gdb中continue执行到断点do_fork处

6.然后执行命令n一直往下调试,可以看到执行到了copy_thread处

二、fork函数分析

fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。相当于克隆了一个自己。当使用fork()系统调用来创建一个新进程时,新进程的状态是TASK_RUNNING(就绪态,但是没有在运行)。当调度器选择这个新创建的进程运行时,新创建的进程就切换到运行态,它也是TASK_RUNNING。

三、总结

Linux系统中,进程的状态在就绪和运行状态都是task_running状态。是否运行取决于是否在CPU的时序上运行,跟windows中类似,当等待事件发生或者资源分配等,进程变为阻塞状态,事件发生或者等待的资源分配后转为就绪状态。进程都是用一个双向循环链表的结构链接起来的。每个进程通过pid标识来区分。第一个进程创建后,当要创建新的进程,先复制父进程的内容,然后修改寄存器、标识符等信息。然后,新 task_struct 结构的地址保存在链表中,而旧进程的 task_struct 结构内容被复制到新进程的 task_struct 结构中。

posted @ 2020-11-22 19:59  20209301黄宇欣  阅读(89)  评论(0编辑  收藏  举报