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

    正常的使用gdb跟踪分析函数调用

    使用make rootfs命令

    *用gdb跟踪分析一个系统调用内核函数

    对于宏SAVE_ALL来说,这条语句会保存当前线程的现场,然后是执行system_call,跳转到相应系统调用号所对应的服务例程当中,也就是在sys_call_table表中找到了相应的函数入口点,然后进入到系统调用表查找到系统调用服务程序的入口函数的地址,再进行跳转,这样便完成了对sys_call_table的进入。接下来伪代码马上就来到了syscall_exit,在执行完syscall_call后,马上接触并退出系统调用

    .macro INTERRUPT_RETURN  ; 中断返回
        iret
    .endm
    .macro SAVE_ALL          ; 保护现场
        ...
    .macro RESTORE_INT_REGS
        ...
    .endm
     
    ENTRY(system_call)
        SAVE_ALL
    syscall_call:
        call *sys_call_table(,%eax,4)
        movl %eax, PT_EAX(%esp)  ; store the return value
    syscall exit:
        testl $_TIF_ALLWORK_MASK, %ecx # current->work
        jne syscall_exit_work
    restore_all:
        RESTORE_INT_REGS
    irq_return:
        INTERRUPT_RETURN      ; 到这里就算执行完了
    ENDPROC(system_call)
     
    syscall_exit_work:
        testl  $_TIF_WORK_SYSCALL_EXIT, %ecx
        jz work_pending
    END(syscall_exit_work)
     
    work_pending:
        testb $_TIF_NEED_RESCHED, %cl
        jz work_notifysig
    work_resched:
        call schedule
        jz restore_all
    work_notifysig:
        ...                  ; deal with pending signals
    END(work_pending)
    

    从system_call到iret之间的整个过程可以用如下流程图表示:

  • 相关阅读:
    AcWing 1018. 最低通行费
    蓝桥杯赛第10届省赛
    P5745 【深基附B例】区间最大和
    P3383 【模板】线性筛素数
    第12届蓝桥杯赛国赛 小蓝买瓜子
    P4715 【深基16.例1】淘汰赛
    AcWing 1015. 摘花生
    第12届蓝桥杯赛省赛 种菜的最大价值
    linq to sql初步
    汇编语言学习笔记接收鼠标消息
  • 原文地址:https://www.cnblogs.com/buhery/p/11735021.html
Copyright © 2011-2022 走看看