linux课程第五周实验及总结

一、学习总结

  • 给MenuOS增加time和time-asm命令(四步操作命令)

rm menu -rf 强制删除
git clone http://github.com/mengning/menu.git   克隆相关信息
cd menu
make rootfs 一个脚本,自动编译自动生成根文件系统,并自动启动MenuOS
  • 使用gdb跟踪系统调用内核函数sys_time

(gdb)b sys_time
(gdb)c # 启动到MenuOs
// 在MenuOs中使用time,会停在time函数处
(gdb)list # 可以看到对应代码
(gdb)s # 单步执行
(gdb)finish # 将这个函数执行完
// 以上两步重复使用,可以看到sys_time函数中的函数,直到看见return i
// sys_time返回后进入汇编代码处理,gdb无法继续进行追踪

系统调用指令:

// 执行int 0x80之后执行system_call对应的代码
(gdb)b system_call # 是可以设置断点的,但是这段是汇编代码,运行时不能在这个断点处停下逐句分析。
  • 系统调用的中断处理过程

    • 系统调用流程图

    • sys_call_table是系统调用分派表
    • syscall_after_all,需要先保存返回值
    • sys_exit_work
      没有这个就restore_all,返回用户态。
      一旦进入sys_exit_work:会有一个进程调度时机

  • 简化后便于理解的system_call伪代码
  • system_call到iret之间的主要代码
SAVE_ALL保存现场

call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,这段是实际的系统调度程序。

restore_all
INTERRUPT_RETURN,是个宏,实际上就是iret,结束。
这个过程中会有sys_exit_work
sys_exit_work中会有work_pending
work_pending中会有work_notifysig,用来处理信号
可能call schedule 进程调度代码
还可能跳转到restore_all,恢复现场。
从以上可以看出:
  1. 在系统调用返回之前,可能发生进程调度,进程调度里就会出现进程上下文的切换
  2. 进程间通信可能有信号需要处理
系统调用就是一个特殊一点的中断,所以也有保护现场恢复现场

二、实验:分析system_call中断处理过程

  • 增加系统调用

    • 在test.c中增加两个函数,Getpid和GetpidAsm

    • make rootfs后,输入help会显示当前菜单

  • 使用gdb调试

    这里需要注意的就是,因为当前是在menu目录下,而所需要的镜像文件不在这个目录下,这时需要使用全路径,不然的话就会出现像上面第二张图的错误。给time处设置断点:

  • c运行之后,在MenuOs里使用time,可以看到它停了下来

最新文章

  1. Android AndroidRuntime类
  2. CentOS 6.6安装配置LAMP服务器(Apache+PHP5+MySQL)
  3. 服务器控件中使用<%#...>, JS和html控件中使用<%=...>
  4. C#语法糖之 ReflectionSugar 通用反射类
  5. codeforce 702E Analysis of Pathes in Functional Graph RMQ+二进制
  6. SQL Server中的分页
  7. 【Android】BroadCast广播机制应用与实例
  8. Android测试分析二
  9. Android 内部启动其他应用,以及打开指定qq聊天界面
  10. 转 ORACLE数据库它可以存储 中文 字节或字符
  11. windows服务器下IIS7 安装URL Rewrite(URL重写)模块
  12. C#之IComparable用法,实现List<T>.sort()排序
  13. ASP.NET Web API2返回值处理流程
  14. 使用uibesizerpath + Cashaplayer画椭圆
  15. Enjoy Markdown!
  16. 评价指标的局限性、ROC曲线、余弦距离、A/B测试、模型评估的方法、超参数调优、过拟合与欠拟合
  17. 中文路径读取乱码,json乱码
  18. Delphi Dll 动态调用例子(1)
  19. 飞控入门之C语言指针回顾
  20. CTF内存高级利用技术

热门文章

  1. Hadoop中正确地添加和移除节点
  2. Oracle Schema Objects——Tables——TableStorage
  3. odex反编译dex异常 Cannot locate boot class path file /system/framework/core.odex
  4. wf-删除所选
  5. Django源码安装方法及创建启动项目
  6. 11个你应该知道的django博客引擎
  7. 【云安全与同态加密_调研分析(2)】国外云安全标准建议组织——By Me
  8. Push h.264 rawdata to rtmp server
  9. Jmeter(三)断言和关联
  10. 8种主要排序算法的C#实现 (二)