Linux内核分析实验五—分析system_call中断处理过程

路过的小游侠+ 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
在上一周的实验课程中,我们分析了 Linux 内核系统调用过程,理解了中断的概念和中断上下文,掌握了系统调用的原理,今天,我们继续以 Linux 内核 系统调用 getpid() 函数为例,更加深入的分析系统调用过程。
1、增加menu内核,gpid,gpidasm

.
2 .使用gdb跟踪分析一个系统调用内核函数

getpid()对应sys_getpid,设置断点b sys_getpid

3、分析内核调用汇编代码

ENTRY(system_call)
    RING0_INT_FRAME        # can't unwind into user space anyway
    ASM_CLAC
    pushl_cfi %eax            # save orig_eax
    SAVE_ALL      #保存现场
    GET_THREAD_INFO(%ebp)    # system call tracing in operation / emulation
    testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
    jnz syscall_trace_entry
    cmpl $(NR_syscalls), %eax
    jae syscall_badsys

syscall_call:
    call *sys_call_table(,%eax,14)    #系统调用

syscall_after_call:
    movl %eax,PT_EAX(%esp)        # store the return value

syscall_exit:
    LOCKDEP_SYS_EXIT
    DISABLE_INTERRUPTS(CLBR_ANY)    # make sure we don't miss an interrupt
                                    # setting need_resched or sigpending
                                    # between sampling and the iret
    TRACE_IRQS_OFF
    movl TI_flags(%ebp), %ecx
    testl $_TIF_ALLWORK_MASK, %ecx    # current->work
    jne syscall_exit_work

restore_all:
    TRACE_IRQS_IRET    #恢复现场

irq_return:
    INTERRUPT_RETURN    #中断返回

简单分析了汇编代码。视频里面提到了,在退出系统调用之前,会检查当前进程是否需要执行 syscall_exit_work,如果需要处理,就会查看是否有进程信号或进程调度,若有进程信号或进程调度就再进行相应操作

Linux内核分析实验五—分析system_call中断处理过程_第1张图片
流程图
总结:本实验通过分析 Linux 内核系统调用源码,深入剖析了系统调用的全过程。通过 int 0x80 中断跳转到系统调用处理程序 system_call 函数处,执行相应的例程。

但是,由于是代表的是用户进程,所以这个执行过程并不属于中断上下文,而是进程上下文。因此,系统调用执行过程中,可以访问用户进程的许多信息,也可以被更高优先级的进程抢占。

当系统调用完成后,把控制权交回到发起调用的用户进程前,内核又会有一次调度。如果发现有优先级更高的进程或当前进程的时间片用完,那么会选择优先级更高的进程或重新选择进程执行。

你可能感兴趣的:(linux,linux,kernel)