20135125陈智威

原创作品转载请注明出处

《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ”

实验目的

通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程。

实验原理:

系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中。(软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。)INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即system_call函数。

system_call函数是怎么找到具体的系统调用服务例程的呢?通过系统调用号查找系统调用表sys_call_table!软中断指令INT 0x80执行时,系统调用号会被放入 eax 寄存器中,system_call函数可以读取eax寄存器获取,然后将其乘以4,生成偏移地址,然后以sys_call_table为基址,基址加上偏移地址,就可以得到具体的系统调用服务例程的地址了!然后就到了系统调用服务例程了。需要说明的是,系统调用服务例程只会从堆栈里获取参数,所以在system_call执行前,会先将参数存放在寄存器中,system_call执行时会首先将这些寄存器压入堆栈。system_call退出后,用户可以从寄存器中获得(被修改过的)参数。

实验步骤:

分析从system_call开始到iret结束之间的整个过程:
1、Entry(system-call)
2、save-all保护现场
3、call *sys-call-table(,%eax,4),调用分度表,找到对应的系统调用
4、syscall- exit检查是否需要跳转,若不需要,执行5,需要执行6
5、restore-all恢复现场,然后iret结束
6、work-pending然后进行work-notifysig处理信号(或者work-resched处理调度,然后call schedule)最后返回restore-all,然后iret结束。

更多相关文章

  1. 熟悉Linux系统的操作
  2. 嵌入式Linux文件系统及其存储机制分析
  3. Linux学习笔记_1.Linux常见指令
  4. 为什么Linux不需要磁盘碎片整理?——借以复习文件系统方面的知识
  5. 安装Linux系统的磁盘分区
  6. Linux系统只能连上内网不能够连上外网。Unit network.service en
  7. linux--输入子系统
  8. Linux学习之文件系统权限及表示
  9. linux 文件系统的管理 (硬盘) 工作原理

随机推荐

  1. 安卓开发日记--2017.10.10
  2. 引用Android(安卓)Design包出现的错误
  3. Android开源库集锦 + Android场景桌面(一
  4. 关于android的中文文档
  5. android SDK包引用了java SDK哪些包
  6. Android 开发人员必须掌握的 10 个开发工
  7. Android 当中的 MVP 模式(二)封装
  8. Android的建议
  9. Android SVG矢量图
  10. Android USB 开发详解