zoukankan      html  css  js  c++  java
  • 2019-2020-1 20199314 《Linux内核原理与分析》 第六周作业

    深入认识系统调用systime_call

    本周深入学习系统调用的机制。

    系统调用的三层机制图如下。

    一、MenuOS增加命令

    先下载新的版本menu。在menu中含有rootfs脚本,make运行一下可以得根文件系统,操作步骤如图。

    运行出的menuOS如图。

    最新的menu中已经把上周做过的两个time函数给添加进去了。

    运行后汇编和c语言文件实现的功能是一样的。

    其实质就是在test.c文件中增加了前一周中的两个函数。

    并且在代码中用两行语句对函数进行调用,如图。

    二、gbd跟踪sys_time

    这次启动linux-3.18.6内核,首先启动qemu。

    在start_kernel处设置断点并list查看函数。

    在sys_time处设置断点并list查看函数。接下来可以一直gdb s进入单步执行状态。但是实验楼环境下很容易就卡住。

    三、系统调用的初始化

    0x80和system_call是通过中断向量联系起来的。而systerm_call实际上就是一段汇编代码的入口。

    xyz和sys_xyz是通过系统调用号联系起来的。

    初始化从start_kernel函数开始,调用其中trap_init函数,再调用set_syster_trap_gate函数也正是由这个函数绑定0x80和system_cal。

    四、systerm_call中断处理

    systerm_call伪代码(从entry(systerm_call))开始。

    sys_call_table查询系统调用号对应的函数,syscall_exit检查是否需要进入syscall_exit_work。

    五、总结——整体内核处理过程示意图

    syscall_exit_work需要跳转到work_pending,里面有work_notifysig处理信号,还有work_resched是需要重新调度,这里是进程调度的时机点call schedule,调度完之后就会跳转到restore_all恢复现场返回系统调用到用户态。

    SAVE_ALL保存现场,中有syscall_call和sys_call_table。

    call * sys_call_table(,%eax,4)调用系统调用的内核处理函数。

    restore-all用于恢复现场。

    INTERRUPT_RETURN用于返回系统调用到用户态结束。

  • 相关阅读:
    FxCopCmd.exe 返回错误代码 65[翻译]
    关于VS2005安装项目制作的三个参考文章链接
    Windows服务开发的四个小经验
    ThreadLocal详解
    java修饰符详解
    聚合、组合、关联、继承之间的区别【转】
    centos单用户模式修改ROOT密码
    vim的配置
    spring注解详解
    centOS修改文本界面分辨率
  • 原文地址:https://www.cnblogs.com/morvalhe/p/11747679.html
Copyright © 2011-2022 走看看