Linux内核分析-分析system_call中断处理过程
2016-03-27 15:45
393 查看
姓名:江军
ID:fuchen1994
分析system_call中断处理过程
使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。
根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
题目自拟,内容围绕系统调用system_call的处理过程进行;
博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。
总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。
实验过程:
第一步:重新编译MENU OS
打开test.c
把我上周写的getpid的系统调用代码写入
修改main函数
重新编译一下
添加进去了,我们来测试一下功能
下面我们来使用gdb进行调试getpid
分析system_call 到iret
根据上面代码可以画图说明如下
总结:
1、用户态到内核态需要int 0x80进行中断,只有生成了中断向量后才可以切换状态;
2、中断处理让CPU停止当前工作转为执行系统内核中预设的一些任务,因此必须要对当前CPU执行的任务进行执行现场的保护工作,并对一些其他杂七杂八的工作进行检查,完成调用后,再进行检查,才能执行iret返回。
3、系统内部调用涉及CPU架构等内容,不同的CPU对于系统调用的汇编具体代码是不一样的。
ID:fuchen1994
分析system_call中断处理过程
使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验。
根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图,撰写一篇署名博客,并在博客文章中注明“真实姓名(与最后申请证书的姓名务必一致) + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”,博客内容的具体要求如下:
题目自拟,内容围绕系统调用system_call的处理过程进行;
博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。
总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程。
实验过程:
第一步:重新编译MENU OS
打开test.c
把我上周写的getpid的系统调用代码写入
int Getpid(int argc , char * argv[]) { int pid; pid=getpid(); printf("pid=%d\n",pid); return 0; } int Getpidasm(int argc , char *argv[]) { int pid; asm volatile( "mov $0,%%ebx\n\t" "mov $0x14,%%eax\n\t" "int $0x80\n\t" "mov %%eax, %0\n\t" :"=m"(pid) ); printf("pid = %d\n",pid); return 0; }
修改main函数
重新编译一下
添加进去了,我们来测试一下功能
下面我们来使用gdb进行调试getpid
20 i386 getpid sys_getpid b sys_getpid
分析system_call 到iret
.macro INTERRUPT_RETURN ; 中断返回 iret .endm .macro SAVE_ALL ; 保护现场 ... .macro RESTORE_INT_REGS ... .endm ENTRY(system_call) SAVE_ALL syscall_call: call *sys_call_table(,%eax,4) movl %eax, PT_EAX(%esp) ; store the return value syscall exit: testl $_TIF_ALLWORK_MASK, %ecx # current->work jne syscall_exit_work restore_all: RESTORE_INT_REGS irq_return: INTERRUPT_RETURN ; 到这里就算执行完了 ENDPROC(system_call) syscall_exit_work: testl $_TIF_WORK_SYSCALL_EXIT, %ecx jz work_pending END(syscall_exit_work) work_pending: testb $_TIF_NEED_RESCHED, %cl jz work_notifysig work_resched: call schedule jz restore_all work_notifysig: ... ; deal with pending signals END(work_pending)
根据上面代码可以画图说明如下
总结:
1、用户态到内核态需要int 0x80进行中断,只有生成了中断向量后才可以切换状态;
2、中断处理让CPU停止当前工作转为执行系统内核中预设的一些任务,因此必须要对当前CPU执行的任务进行执行现场的保护工作,并对一些其他杂七杂八的工作进行检查,完成调用后,再进行检查,才能执行iret返回。
3、系统内部调用涉及CPU架构等内容,不同的CPU对于系统调用的汇编具体代码是不一样的。
相关文章推荐
- 为VirtualBox里的Linux系统安装增强功能
- linux内核设计与实现一书阅读整理 之第五章
- Linux基础--系统启动流程
- 给linux移植Ethercat笔记
- 《Linux内核分析》-- 扒开系统调用的三层皮(下)之system_call中断处理过程 20135311傅冬菁
- Linux C目标文件
- 《Linux内核分析》第五周学习总结 扒开系统调用的三层皮(下)
- 实现 linux 终端上不同字体颜色显示
- 解决PXE批量安装Linux系统时kickstart自动识别硬盘名称的问题
- Debugging Under Unix: gdb Tutorial
- Linux中如何开启8080端口供外界访问
- linux编译安装LAMP
- Linux CentOS6系统安装最新版本Node.js环境及相关文件配置
- Linux 上的原生 ZFS 支持已功能完备,支持 2.6.32 到 4.5 的 Linux 内核
- linux环境中英文切换配置以及乱码问题
- Linux内核协议栈(附2)内核如何通过file对象找到对应的socket对象?
- linux内核分析——扒开系统调用的三层皮(下)
- 《Linux内核设计与实现》读书笔记 第十八章 调试
- 20135239 益西拉姆 linux内核分析 扒开系统调用的三层皮(下)
- 浅谈Linux PCI设备驱动