Linux内核分析 lab4 扒开系统调用的三层皮(下)

郑卓彬 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

本次作业,理解上次作业的系统调用的代码


本次实验步骤:

1.将上次的函数添加到test.c中,调用menuconfig。

2.用gdb跟踪内核代码,理解系统调用原理。


menu结果展示:


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第1张图片
图一.整体效果


图二.执行效果

调试结果展示:

使用gdb将断点订到sys_fork函数,就可以在执行时停在这,然后用n一行一行理解。

步骤如下图:


图三 .步骤一


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第2张图片
图四.步骤二

图四:fork函数实际上调用了 do_fork()函数


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第3张图片
图五 步骤三

图五:其中p就是新生的字进程把。


图六 步骤四

图六:p由copy_process()函数生成。

由于其中实在太细,没耐心看了,so,下面跳着来。

Linux内核分析 lab4 扒开系统调用的三层皮(下)_第4张图片
图七 零碎步骤

图七:对p的一些前期准备工作。


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第5张图片
图八 零碎步骤

图八:对p的内存拷贝,命名域拷贝


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第6张图片
图九 零碎

图九:对io啊一些拷贝


Linux内核分析 lab4 扒开系统调用的三层皮(下)_第7张图片
图十 拷贝结束 

图十:拷贝结束,进行系统的进程调度。

以上就是fork()系统调用,总体上就是对旧进程进行拷贝,对新进程进行枷锁。最后在进行进程调度。


系统调用流程图:

System_call -> Save_All -> Sys_call_table -> mov %eax,PT_AX() -> Syscall_exit ( -> Syscall_exit_work -> Work_pending -> Work_notifysig -> Work_researched -> schedule) -> restore_all -> irq_return



总结:

主要对fork系统调用有了一定理解。

你可能感兴趣的:(Linux内核分析 lab4 扒开系统调用的三层皮(下))