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之间的整个过程可以用如下流程图表示:

  • 相关阅读:
    Codeforces Round #365 Div.2
    Codeforces Round #363 Div.2[111110]
    花花的礼物 (huahua)
    FOI2019算法冬令营D1
    树(tree)
    noip2018
    1972: 最短路(shortest)
    2462: 收集(collecting)
    1282: 排列计数 perm
    1425: 数列(seq)
  • 原文地址:https://www.cnblogs.com/buhery/p/11735021.html
Copyright © 2011-2022 走看看