郑卓彬 + 原创作品转载请注明出处 + 《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系统调用有了一定理解。