Linux 内核分析五
2016-03-23 12:58
567 查看
江博文 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验内容
使用gdb跟踪分析一个系统调用内核函数,系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl,推荐在实验楼Linux虚拟机环境下完成实验。
根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图。
实验截图
实验分析
1、用户态到内核态需要int 0x80进行中断,只有生成了中断向量后才可以切换状态;
2、中断处理让CPU停止当前工作转为执行系统内核中预设的一些任务,因此必须要对当前CPU执行的任务进行执行现场的保护工作,并对一些其他工作进行检查,完成调用后,再进行检查,才能执行iret返回。
3、不同的CPU对于系统调用的汇编代码是不一样的。
SYSTEM_CALL伪码分析
流程图:
实验内容
使用gdb跟踪分析一个系统调用内核函数,系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl,推荐在实验楼Linux虚拟机环境下完成实验。
根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图。
实验截图
实验分析
1、用户态到内核态需要int 0x80进行中断,只有生成了中断向量后才可以切换状态;
2、中断处理让CPU停止当前工作转为执行系统内核中预设的一些任务,因此必须要对当前CPU执行的任务进行执行现场的保护工作,并对一些其他工作进行检查,完成调用后,再进行检查,才能执行iret返回。
3、不同的CPU对于系统调用的汇编代码是不一样的。
SYSTEM_CALL伪码分析
<span style="font-size:14px;">ENTRY(system_call) RING0_INT_FRAME // can't unwind into user space anyway ASM_CLAC pushl_cfi %eax // save orig_eax SAVE_ALL // 保存系统寄存器信息 GET_THREAD_INFO(%ebp) // 获取thread_info结构的信息 # system call tracing in operation / emulation testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) // 测试是否有系统跟踪 jnz syscall_trace_entry // 如果有系统跟踪,先执行,然后再回来 cmpl $(NR_syscalls), %eax // 比较eax中的系统调用号和最大syscall,超过则无效 jae syscall_badsys // 无效的系统调用 直接返回 syscall_call: call *sys_call_table(,%eax,4) // 调用实际的系统调用程序 syscall_after_call: movl %eax,PT_EAX(%esp) // 将系统调用的返回值eax存储在栈中 syscall_exit: LOCKDEP_SYS_EXIT DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret TRACE_IRQS_OFF movl TI_flags(%ebp), %ecx testl $_TIF_ALLWORK_MASK, %ecx // 检测是否所有工作已完成 jne syscall_exit_work // 未完成,则去执行这些任务 restore_all: TRACE_IRQS_IRET // iret 从系统调用返回</span>
流程图:
相关文章推荐
- CentOS7,将文本模式改成图形界面模式
- Linux学习笔记(十一)-系统安全篇…
- Linux学习笔记(十)-服务器配置篇…
- Linux学习笔记(九)-服务器配置篇…
- Linux学习笔记(八)-程序开发篇之…
- Linux学习笔记(六)-系统管理篇之…
- Linux学习笔记(五)-系统管理篇之…
- Linux学习笔记(四)-系统管理篇之…
- 先装linux后装windows的双系…
- Linux学习笔记(三)—系统管理篇之…
- Linux学习笔记(二)-系统管理篇之…
- Linux学习笔记(一)-基础篇
- Linux新建用户,赋予root权限
- CentOS上执行android中mkscard报错的解决方法
- 移植minicom到嵌入式linux系统
- Linux删除软链接
- 更改Linux时区的两种方法
- Linux定时任务Crontab详解
- Linux系统设置定时任务
- Linux文件访问权限