zoukankan      html  css  js  c++  java
  • 分析system_call中断处理过程

    分析system_call中断处理过程

     符钰婧 原创作品转载请注明出处 

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

    这次的实验是使用gdb跟踪分析一个系统调用内核函数,这里用的是122号函数uname

    先在实验楼的虚拟机中MenuOs增加unameuname-asm指令。

    具体实现如下:

    1、克隆新版本的menu

     

    2、进入menu

     

    3、进入test.c

     

    4、添加代码

     

    5、待续。。

    接下来分析system_call代码的具体调用过程(代码在kernel/entry_32.S中)

     

     

    (由于代码较复杂,孟宁老师在视频中讲解了简化之后的伪代码,本文也将用简化代码来分析系统调用的过程)

    简化代码如下:

     

    代码中先定义了两个宏(SAVE_ALL、RESTORE_ALL)

     

    16行是调用此系统调用所对应的函数(在122号函数uname中调用的就是sys_newuname

    17行保存返回值;

    在18行exit的时候,会检测当前的任务是不是需要处理;

    如果不需要处理,就跳转到21行restore_all;

    然后执行23行return,系统调用就结束了。

    *但是一般情况下都会有需要处理的任务,此时就会进入到26行处syscall_exit_work

     

    然后跳转到30行work_pending,32行处理信号;

    如果需要重新调度,就会执行到33行work_resched,先进行调度call_schedule,然后再跳转到restore_all,返回系统调用。

    system_call开始到iret结束之间的整个过程,可以用流程图表示如下:

    总结:

    在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换;

    在当前进程的时候,有些信号可能需要处理。

    内核可以抽象成是很多种不同的中断处理过程的集合。

  • 相关阅读:
    Python项目生成requirements.txt的多种方式
    标准的Flask启动文件
    Flask的错误日志处理和|ORM操作
    Django的model中创建表
    Redis的删除机制、持久化 主从
    RabbitMQ 消息队列
    IP地址与子网掩码逐位相与
    IP地址转二进制
    一款很好用的工具
    放球问题
  • 原文地址:https://www.cnblogs.com/fuyujing/p/5314258.html
Copyright © 2011-2022 走看看