曹朋辉
原创作品转载请注明出处
《Linux内核分析》MOOC课程
将mkdir命令加入到menuos中
可惜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)
根据以上代码画出流程图如下:
系统调用流程小结:
1.执行用户程序(如:time,getpid)
2.根据glibc中的函数实现,取得系统调用号并执行int $0x80产生中断。
3.进行地址空间的转换和堆栈的切换,执行SAVE_ALL。(进行内核模式) 4.进行中断处理,根据系统调用表调用内核函数。
5.执行内核函数。
6.执行RESTORE_ALL并返回用户模式