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

    分析system_call中断处理过程

    一、先在实验楼的虚拟机中MenuOs增加utsname和utsname-asm指令。

    • 1、克隆最新新版本的menu,之后进入menu

    • 2、进入test.c,完成之后make rootfs,使系统自动编译自动运行,并测试新加入的time以及time-asm

    • 查看一下新扩展的两个函数

    • 3.设置分割点,用gdb追踪

    二、然后开始使用gdb追踪系统调用内核函数sys_time

    • 1、设置断点sys_time

    • 2.继续执行,系统会启动到menuos,执行time命令(可发现此命令执行到一半卡住了),可以看到出现了一个断点

    • 3.继续单步执行,直到出现return i

    • 4.设置断点(system_call),继续执行可发现time有返回

    三、实验分析

    • system_call的代码:
    
    ENTRY(system_call)
        RING0_INT_FRAME    
        ASM_CLAC        
        pushl_cfi %eax            //保存系统调用号;
        SAVE_ALL                  //可以用到的所有CPU寄存器保存到栈中
        GET_THREAD_INFO(%ebp)     //ebp用于存放当前进程thread_info结构的地址
        testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
        jnz syscall_trace_entry
        cmpl $(nr_syscalls), %eax  //检查系统调用号(系统调用号应小于NR_syscalls),
        jae syscall_badsys         //不合法,跳入到异常处理
    syscall_call:
        call *sys_call_table(,%eax,4) //合法,对照系统调用号在系统调用表中寻找相应服务例程
        movl %eax,PT_EAX(%esp)        //保存返回值到栈中
    syscall_exit:  
        testl $_TIF_ALLWORK_MASK, %ecx   //检查是否需要处理信号
        jne syscall_exit_work        //需要,进入 syscall_exit_work
    restore_all: 
        TRACE_IRQS_IRET              //不需要,执行restore_all恢复,返回用户态
    irq_return:
        INTERRUPT_RETURN             //相当于iret
    
    
    • system_call流程:

    • 分析
      首先将系统调用号(eax)和可以用到的所有CPU寄存器保存到相应的堆栈中(由SAVE_ALL完成);
      对用户态进程传递过来的系统调用号进行有效检查(eax是系统调用号,它应该小于NR_syscalls),如果是合法的系统调用,再进一步检测该系统调用是否正被跟踪。根据eax中的系统调用号调用相应的服务例程。
      服务例程结束后,从eax寄存器获得它的返回值,并把这个返回值存放在堆栈中,让其位于用户态eax寄存器曾存放的位置。然后跳转到ret_from_sys_call(),终止系统调用程序的执行。

    • 从system_call开始到iret结束之间的整个过程流程图表示如下:

  • 相关阅读:
    Python2和3的区别
    Linux内核的中断机制
    Linux内核的并发与竞态、信号量、互斥锁、自旋锁
    驱动程序实例(五):LCD驱动程序分析(Samsung LCD)
    Linux字符设备驱动框架(五):Linux内核的framebuffer驱动框架
    驱动程序实例(四):按键驱动程序(platform + input子系统 + 外部中断方式)
    Linux字符设备驱动框架(四):Linux内核的input子系统
    gpiolib库详解
    Linux字符设备驱动框架(三):Linux内核的misc类设备驱动框架
    驱动程序实例(三):蜂鸣器驱动程序(misc类设备驱动框架)
  • 原文地址:https://www.cnblogs.com/destiny-love/p/11743134.html
Copyright © 2011-2022 走看看