实验报告:
本实现希望通过gdb调试进入linux 内核中 查看getpid这个系统调用是如何执行的
1:把Getpid 与Getpid_asm 放到menu/test.c 中
2: make rootfs
3 开始gdb 调试 ,因为调用getpid执行的是sys_getpid,我打了一个断点 系统运行后在此处中断
4 最后finish得到的结果
5.通过单步调试
主要经历了以下函数
task_tgid_vnr
pid_vnr
pid_nr_ns
this_cpu_read_stable
task_pid
task_active_pid_ns
ns_of_pid
6.分析system_call
上面的图片大体上描述了system_call到irq_return的过程,在系统调用system_call 后 ,需要先保存现场SAVE_ALL 然后调用 system_call_table 和eax用以确定调用的系统函数,陷入系统内核。在内核处理完后需要判断要不要调用syscall_exit_work然后调用work_pending,然后判断是否有消息需要处理,如果需要就调用work_notifysig,如果不需要就调用work_resched ,在此函数会调用call schedule 进行进程调度(此处为关键步骤),然后会判断是否还需要调度,如果需要进行自循环,如果不需要这执行retore_all,最后执行irq_return.此过程充分体现了进程间切换的思路,保存现场,切换到其他进程,再切换回来,恢复现场。