Linux内核分析第五周——扒开系统调用的“三层皮”(下)

李雪琦+原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

一、知识点总结

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

  • 1.更新menu代码到最新版
  • 2.test.c中main函数里,增加MenuConfig()
  • 3.增加对应的两个函数,Time和TimeAsm函数
  • 4.make rootfs自动编译脚本

(二)使用gdb调试跟踪系统调用内核函数sys_time

  • 为处理time函数的系统调用systime设置断点之后,在menuOS中执行time。发现系统停在systime处。继续按n单步执行,会进入schedule函数。
  • sys_time返回之后进入汇编代码处理,gdb无法继续跟踪。
  • 如果在syscall设置断点(entry32.S),然后输入c之后,发现是不会在sys_call处停下来的(因为这里是一处系统调用函数而不是正常函数)。

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

1.系统调用在内核代码中的工作机制和初始化

  • 整个系统调用过程中,时间很重要。

  • 以system_call为例,int 0x80指令与systemcall是通过中断向量联系起来的,而API和对应的sys是通过系统调用号联系起来的。

  • 用户态时,系统调用xyz()使用int 0x80,它对应调用system_call。
  • 右边的处理过程(汇编代码)非常重要,通过系统调用号匹配起来。

2.系统调用机制的初始化

trap_init函数里面有一个set_system_trap_gate函数,其中涉及到了系统调用的中断向量SYSCALL_VECTOR和汇编代码入口system_call,一旦执行int 0x80,CPU直接跳转到system_call来执行。

3.简化后便于理解的system_call伪代码

systemcall的位置就在ENTRY(systemcall)处,其他中断的处理过程与此类似。

  • SAVE_ALL:保存现场

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

  • sys_call_table:系统调用分派表

  • syscall_after_all:保存返回值

若有sys_exit_work,则进入sys_exit_work:会有一个进程调度时机。
work_pending -> work_notifysig,用来处理信号。

  • 可能call schedule:进程调度代码。
  • 可能跳转到restore_all,恢复现场。

若无sys_exit_work,就执行restore_all恢复,返回用户态。

INTERRUPT_RETURN <=> iret,结束。

4.简单浏览system_call到iret之间的主要代码

  • 1.SAVE_ALL:保存现场
  • 2.syscall_call:调用了系统调用处理函数
  • 3.restore_all:恢复现场(因为系统调用处理函数也算是一种特殊的“中断”)
  • 4.syscallexitwork:如3.中所述
  • 5.INTERRUPT RETURN:也就是iret,系统调用到此结束

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

(一)使用gdb跟踪分析一个系统调用内核函数(上周选择的系统调用)——getpid

  • 1.先执行rm menu -rf,强制删除原有的menu文件夹,使用git命令更新menu代码至最新版。

  • 2.在test.c中添加C函数、汇编函数

  • 3.make rootfs,输入help,可以看到qemu中增加了我们先前添加的命令。

(二)使用gdb跟踪分析一个系统调用内核函数

(三)system_call到iret过程流程图

三、总结

(一)从系统调用处理过程到一般的中断处理过程

1.保存现场

  • 在系统调用时,用SAVE_ALL来保存系统调用时的上下文。
  • 中断处理的第一步也是要保存中断程序现场。
  • 中断处理完之后,可以返回到原来被中断的地方,在原有的运行环境下继续正确的执行下去。

2.确定中断信息

  • 在系统调用中,需要将系统调用号通过eax传入,通过sys_call_table查询到调用的系统调用,然后跳转到相应的程序进行处理。
  • 中断处理时系统也需要有一个中断号,通过检索中断向量表,了解中断的类型和设备。

3.处理中断

  • 跳转到相应的中断处理程序后,对中断进行处理。

4.返回

  • 系统调用时最后要restore_all恢复系统调用时的现场,并用iret返回用户态。
  • 同样,执行完中断处理程序,内核也要执行特定指令序列,恢复中断时现场,并使得进程回到用户态。

(二)使用gdb跟踪调试内核的方法:

  • qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S 
  • (gdb)file linux-3.18.6/vmlinux # 在gdb界面中targe remote之前加载符号表
  • (gdb)target remote:1234 #建立gdb和gdbserver之间的连接,按c 让qemu上的Linux继续运行
  • (gdb)break start_kernel #断点的设置,注意寻找对应的系统调用函数名字,例如time命令对应sys_time

Linux内核分析第五周——扒开系统调用的“三层皮”(下)的更多相关文章

  1. 20135327郭皓--Linux内核分析第五周 扒开系统调用的三层皮(下)

    Linux内核分析第五周 扒开系统调用的三层皮(下) 郭皓 原创作品转载请注明出处 <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/U ...

  2. Linux内核分析第五周 扒开系统调用的三层皮(下) (20135304 刘世鹏)

    作者:刘世鹏20135304  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加t ...

  3. linux内核分析 第五周 扒开系统调用的三层皮(下)

    rm menu -rf 强制删除原menu文件 git clone http://github.com/mengning/menu.git 从github中克隆 cd menu 在test.c中增加上 ...

  4. LINUX内核设计第五周——扒开系统调用的三层皮(下)

  5. 《Linux内核分析》第四周 扒开系统调用的“三层皮”

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FOUR( ...

  6. Linux内核及分析 第五周 扒开系统调用的三层皮(下)

    实验内容: 1.执行rm menu -rf命令,强制删除原有的menu 2.使用git命令 git clone https://github.com/mengning/menu.git 克隆新的men ...

  7. Linux内核设计第五周——扒开系统调用三层皮(下)

    Linux内核设计第五周 ——扒开系统调用三层皮(下) 一.知识点总结 1.给MenuOS增加新的命令的步骤 更新menu代码到最新版 test.c中main函数里,增加MenuConfig() 增加 ...

  8. 《Linux内核分析》第五周 扒开系统调用的三层皮(下)

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK FIVE( ...

  9. Linux内核分析——第五周学习笔记

    第五周 扒开系统调用的“三层皮”(下) 一.知识点总结 (一)给MenuOS增加time和time-asm命令 在实验楼中,首先 强制删除menu (rm menu -rf) 重新克隆一个新版本的me ...

随机推荐

  1. Linux学习(一)------CentOs安装mysql5.5 数据库

    具体方法和步骤如下所示: 1.第一步就是看linu是否安装了mysql,经过rpm -qa|grep mysql查看到centos下安装了mysql5.1,那就开始卸载咯 2.接下来就是卸载mysql ...

  2. Git之hotfix热修复分支

    1.假设你正在开发一个新功能, 需要新建一个new分支并切换: git checkout -b new 等价于 git branch new git checkout new 然后在这个new分支上已 ...

  3. mybatis按datetime条件查询,参数为时间戳时

    mybatis按datetime条件查询,参数为时间戳时,如果数据库为2018-1-1 20:22:10, 你的时间戳也为2018-1-1 20:22:10,但却没找到数据.可能是时差导致的.百度修正 ...

  4. 4星|《财经》2018年第13期:年轻人大多从大三和大四起开始就从QQ向微信转移

    <财经>2018年第13期 总第530期 旬刊 本期主要话题是快递业,其他我感兴趣的重要话题还有:香港9价HPV疫苗断供风波:华盛顿邮报被贝佐斯收购后这几年的变化:北京二中朝阳学校的划片风 ...

  5. sql脚本创建用户角色权限表

    /******************************************/ /* 名称:权限管理 */ /* 编写日期:2010.5.20 */ /* 开发者:dangqinghua * ...

  6. 安装好Oracle Client以后没有tnsnames.ora文件

    安装好Oracle Client以后没有tnsnames.ora文件 安装完Oracle Client以后,发现相应目录中没有tnsnames.ora文件,其实只要手动建立一个就可以了.在 oracl ...

  7. C# string 常用方法

    string.ToString().Contains() String str="abcd" str.ToString().Contains("a"); //t ...

  8. 事后诸葛亮--Alpha版本总结

    目录 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结: 本小组和其他组的评分 分工和贡献分 全组讨论的照片 问题 第一组提问回答:爸爸饿了队 第二组提问回答:拖 ...

  9. 【IdentityServer4文档】- 启动和概览

    启动和概览 有两种基本的方式来启动一个新的 IdentityServer 项目: 从空项目开始(从头开始) 从 Visual Studio 的 ASP.NET Identity 模板开始 假如您从头开 ...

  10. lintcode-445-余弦相似度

    445-余弦相似度 Cosine similarity is a measure of similarity between two vectors of an inner product space ...