也是为了做MOOC上面的课程,才有了这篇文章。
由于时间仓促,难免有遗漏 错误地方 敬请指出!
实验环境;虚拟机kali linux 3.18
编译器:gcc
编程语言:c语言
编辑器:vim
首先贴出我们需要分析的C源码
首先程序很简单 就是main函数调用sea函数 sea函数再调用wm函数完成整个程序的执行。
接下来再看一下反汇编的代码
让我们定位到18行的main函数 首先pushl %ebp到subl $4, %ebp首先完成了main函数自己的堆栈结构 21行movl $8, (%esp) 这个动作称作压栈 也就是我们的sea(8), 接着调用sea函数 call的功能很强大,首先将eip压入main的堆栈 ,然后eip指向sea函数 好了 让我们到sea函数 sea只有一个动作 就是return wm(x )
继续看sea函数的反汇编代码 大同小异 首先依然像main函数一样建立自己的堆栈段 ,压入参数 ,call wm函数 sea函数最后面还有leave ret 这个我们等下解释,让我们跟随sea函数到达wm函数, wm函数依然执行了三步操作 1 建立自己堆栈 2 完成函数操作 3 清除自己堆栈段 以及通过ret改变eip执行wm函数 wm函数也通过相同的手段返回到main函数 最后我们发现 所有用到的堆栈段全部已经成功清除 没有造成内存泄露 。
以上就是简单的系统调用函数分析。
但是我们最后可以发现,我们的计算机并不是一个单任务系统 而是多任务系统?那又是怎么是实现的呢? 多任务系统通过中断处理机制 完成任务的切换 ,我们发现中断处理机制和函数调用也有相同点 处理机制保存中断现场 恢复现场 函数调用保存eip esp 恢复eip esp ----个人观点
----张振海