• 分析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),其中可能还会发生中断上下文的切换和进程上下文的切换;

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

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

  • 相关阅读:
    SVN中trunk、branches、tag的使用
    svn建立分支和svn代码合并的操作方法
    SVN分支的合并和同步
    iOS开发--即时通讯
    iOS 开发--开源图片处理圆角
    ios开发--网易滚动导航栏
    ios开发--高德地图SDK使用简介
    大型网站架构演变和知识体系
    Nginx配置文件nginx.conf中文详解
    nginx+apache+php+mysql服务器集群搭建
  • 原文地址:https://www.cnblogs.com/fuyujing/p/5314258.html
Copyright © 2020-2023  润新知