使用gdb跟踪分析系统调用mkdir

曹朋辉
原创作品转载请注明出处
《Linux内核分析》MOOC课程

将mkdir命令加入到menuos中

使用gdb跟踪分析系统调用mkdir_第1张图片
增加mkdir

可惜menu OS 还没有实现ls 命令查看不到效果,以后有时间了自己实现一下。

以下为精简后的系统调用处理过程的汇编伪代码


# system call
# asm pseudo code
# 系统调用处理过程的汇编伪代码

.macro INTERRUPT_RETURN
         iret
.endm 

.marco  SAVE_ALL
     ...
.endm
.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 $_TLF_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 retore_all
work_notifysig:   #deal with pending signals
  ...
END(work_pending)

根据以上代码画出流程图如下:

使用gdb跟踪分析系统调用mkdir_第2张图片
流程图

系统调用流程小结:
1.执行用户程序(如:time,getpid)   
2.根据glibc中的函数实现,取得系统调用号并执行int $0x80产生中断。   
3.进行地址空间的转换和堆栈的切换,执行SAVE_ALL。(进行内核模式)   4.进行中断处理,根据系统调用表调用内核函数。   
5.执行内核函数。   
6.执行RESTORE_ALL并返回用户模式

你可能感兴趣的:(使用gdb跟踪分析系统调用mkdir)