作者:黎静

一、知识点总结

(一)给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中增加了我们先前添加的命令。

system_call到iret过程流程图

Linux第五周学习总结的更多相关文章

  1. Linux第五周学习总结——扒开系统调用的三层皮(下

    Linux第五周学习总结--扒开系统调用的三层皮(下) 作者:刘浩晨 [原创作品转载请注明出处] <Linux内核分析>MOOC课程http://mooc.study.163.com/co ...

  2. 20135320赵瀚青LINUX第五周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 按照刘老师的周从三个角 ...

  3. 20135337朱荟潼 Linux第五周学习总结——扒开系统调用的三层皮(下)

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课http://mooc.study.163.com/course/USTC 1000029000 一.学习内容 (一 ...

  4. 《Linux内核分析》第五周学习总结

    <Linux内核分析>第五周学习总结                                  ——扒开系统调用的三层皮(下) 姓名:王玮怡 学号:20135116 1.给menu ...

  5. 《Linux内核分析》第五周学习笔记

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

  6. LINUX内核分析第五周学习总结——扒开系统调用的“三层皮”(下)

    LINUX内核分析第五周学习总结--扒开系统调用的"三层皮"(下) 标签(空格分隔): 20135321余佳源 余佳源 原创作品转载请注明出处 <Linux内核分析>M ...

  7. LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下)

    LINUX内核分析第五周学习总结——扒开应用系统的三层皮(下) 张忻(原创作品转载请注明出处) <Linux内核分析>MOOC课程http://mooc.study.163.com/cou ...

  8. linux内核分析第五周学习笔记

    linux内核分析第五周学习笔记 标签(空格分隔): 20135328陈都 陈都 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.co ...

  9. Linux内核分析第五周学习总结——分析system_call中断处理过程

    Linux内核分析第五周学习总结--分析system_call中断处理过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

随机推荐

  1. 在excel中将缺失数据全部用0补齐

    先ctrl+H ,出现如下对话框 点击“定位”,选择“空值” 在表格中空的位置上编辑栏输入0,CTRL+ENTER,即可将缺失数据全部用0补齐.

  2. golang类型判断

    _.ok:=interface{}(a).(B) 此语句用于判断对象a是否是B类型 也可以判断对象a是否实现了B接口 package main import "fmt" type ...

  3. GUI_事件监听机制与ActionListener演示

    事件监听机制组成: 事件源:(awt包或者swing包中的那些图形界面组件)(被打的那个人,被点击的组件,可以承受某些事件,但不是所有事件都能承受) 事件:每个事件源都有自己特有的对应事件和共性事件( ...

  4. UOJ #390. 【UNR #3】百鸽笼

    UOJ #390. [UNR #3]百鸽笼 题目链接 看这道题之前先看一道相似的题目 [PKUWC2018]猎人杀. 考虑类似的容斥: 我们不妨设处理\(1\)的概率. 我们令集合\(T\)中的所有鸽 ...

  5. (6)Python集合

  6. Android实践--apk反编译

    版权声明:本文为博主原创文章.转载请注明出处. https://blog.csdn.net/ysjian_pingcx/article/details/25468867 Android apk反编译一 ...

  7. php获取两个数组相同的元素(交集)以及比较两个数组中不同的元素(差集)

    (一)php获取两个数组相同元素 array  array_intersect(array  $array1, array $array2, [, array $...]) array  array_ ...

  8. Arduino IDE for ESP8266 项目云盒子(3)外网访问

    互联网访问esp8266 https://item.taobao.com/item.htm?spm=a230r.1.14.20.eYblO3&id=521945102409&ns=1& ...

  9. Shell逻辑语句

    case esac 语句 参考 :https://blog.csdn.net/wu20093346/article/details/47210809 case ... esac 与其他语言中的 swi ...

  10. nodejs写入json文件,格式化输出json的方法

    假如我需要把data序列化成json字符串,然后写入data.json文件中,代码如下: let str = JSON.stringify(data) fs.writeFile('data.json' ...