Linux内核分析(实验五)分析system_call中断处理过程
2016-03-25 00:00
645 查看
摘要: 分析system_call中断处理过程
原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux内核源码地址
实验报告:
本实现希望通过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.此过程充分体现了进程间切换的思路,保存现场,切换到其他进程,再切换回来,恢复现场。
原创作品转载请注明出处《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
Linux内核源码地址
实验报告:
本实现希望通过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.此过程充分体现了进程间切换的思路,保存现场,切换到其他进程,再切换回来,恢复现场。
相关文章推荐
- Linux C函数参考手册(PDF版)
- C# partial关键字说明
- Lua教程(十七):C API简介
- 简单谈谈lua和c的交互
- C#中的委托数据类型简介
- C#实现打造气泡屏幕保护效果
- 举例讲解C#编程中委托的实例化使用
- 使用C#代码获取存储过程返回值
- C/C++数据对齐详细解析
- 利用C语言来求最大连续子序列乘积的方法
- 字符串的组合算法问题的C语言实现攻略
- C 语言基础教程(我的C之旅开始了)[三]
- 学习C和C++的9点经验总结
- C++中的extern “C”用法详解
- C 语言基础教程(我的C之旅开始了)[七]
- 最大子矩阵问题实例解析
- C字符串操作函数实现方法小结
- C语言中static的作用及C语言中使用静态函数有何好处