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

  • 相关阅读:
    线程和进程
    Map和Collection
    数组
    泛型
    堆和栈
    Java的三大特性
    Log日志
    关系运算
    switch
    main 及Scanner
  • 原文地址:https://www.cnblogs.com/buhery/p/11735021.html
Copyright © 2011-2022 走看看