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

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

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


本次实验步骤:

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

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


menu结果展示:


图一.整体效果


图二.执行效果

调试结果展示:

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

步骤如下图:


图三 .步骤一


图四.步骤二

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


图五 步骤三

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


图六 步骤四

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

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

图七 零碎步骤

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


图八 零碎步骤

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


图九 零碎

图九:对io啊一些拷贝


图十 拷贝结束 

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

以上就是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系统调用有了一定理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容