姓名:何伟钦

学号:20135223

( *原创作品转载请注明出处*)

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

内容:1.使用gdb跟踪分析一个系统调用内核函数

2.根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图

一、给MenuOS增加time和time-asm命令

(一) 克隆并自动编译MenuOS

  1. rm menu -rf      //强制删除原menu文件

  2. git clone http://github.com/mengning/menu.git //从github中克隆

  3. cd menu   //进入menu目录

  4. make rootfs //运行自动编译脚本,生成根文件系统,启动MenuOS

(二)给MenuOS增加time和time-asm命令

1.更新menu代码到最新版

2.在test.c中main函数里,增加MenuConfig

3.增加对应的两个函数:Time和TimeAsm

4。make rootfs

二、使用gdb跟踪调试内核

1.运行MenuOS系统

在实验楼的虚拟机环境里,打击打开shell,使用命令

cd LinuxKernel/

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img

2.调试运行

1)使用带参数命令启动MenuOS

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S

输入help,可以看到当前的系统调用:

2)启动gdb,设置断点,运行

(gdb)file linux-3.18.6/vmlinux    //在出现gdb提示符后,加载符号文件

(gdb)target remote:1234         //建立和被调试程序的连接

(gdb)break start_kernel  //在start_kernel函数入口处设置断点

(gdb)break  sys_time     //在系统调用time的位置设置断点

(gdb)c   //继续输入c,使得系统运行到start_kernel处停住

(gdb)s   //单步执行

(gdb)finish // 将这个函数执行完

list可以查看内部的函数,直到sys_time返回后进入汇编代码处理,gdb无法继续进行追踪

扩展知识:

三、系统调用在内核代码中的处理过程

(一)系统调用在内核代码中的工作机制和初始化

main.c中start_kernel函数:trap_init()

set_system_trap_gate(SYSCALL_VECTOR,&system_call)    一执行int 0x80,系统直接跳转到system_call。

SYSCALL_VECTOR:系统调用的中断向量

&system_call:汇编代码入口

(二)system_call到iret之间的主要代码

1.SAVE_ALL:保存现场

2.syscall_call:调用了系统调用处理函数(call *sys_call_table(,%eax,4)调用了系统调度处理函数,eax存的是系统调用号,是                           实际的系统调度程序。                       sys_call_table:系统调用分派表)

3.restore all:恢复现场

4.syscall exit work:若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。work_pending -> work_notifysig,用来处理信号,可能call schedule:进程调度代码可能跳转到restore_all,恢复现场。

5. INTERRUPT RETURN:宏,也就是iret,系统调用到此结束

流程图如下:

最新文章

  1. 常用正则表达式-copy
  2. python requests
  3. Socket Programming in C#--Multiple Sockets
  4. scala学习笔记(1)
  5. MySQL - “Timeout error occurred trying to start MySQL Daemon”解决方法
  6. hdu 4452
  7. Qt 错误: 无法运行 release 下的可执行文件
  8. android 实现蓝牙自动配对连接
  9. 开源Math.NET基础数学类库使用(14)C#生成安全的随机数
  10. NSIS:强制结束软件进程
  11. SSAS系列——【08】多维数据(程序展现Cube)
  12. as3中textField输入字符时,一次性过长后自动换行
  13. [Bayesian] “我是bayesian我怕谁”系列 - Naive Bayes+prior
  14. 自理一遍android 高级知识
  15. java项目的异常处理
  16. Codeforces 348D Turtles LGV
  17. 将Long类型转为字母数字组合的jar包---Hashids
  18. python之模块ftplib(FTP协议的客户端)
  19. Learn Rails5.2 Routes。( 很少用到的参数:constraints和redirect)
  20. Drupal8 新建第一个模块

热门文章

  1. docker swarm英文文档学习-4-swarm模式如何运行
  2. MetaMask/provider-engine-2-代码
  3. jquery另外一种类似tab切换效果
  4. hadoop集群部署配置补充
  5. Android动态的全屏和退出全屏
  6. day62
  7. DB2创建function(一)
  8. AbelSu玩Kotlin
  9. WC 2019 游记 - 败者之低语
  10. C语言如何向系统接要存