标签(空格分隔): Linux Linux内核 操作系统
@干宇航
原创作品转载请注明出处
@《Linux内核分析》MOOC课程
小彩蛋,quit功能实现了,,,,
上周的Blog在这里《week4-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用》。
实验环境:Linux gain 4.2.0-30-generic #36-Ubuntu SMP Fri Feb 26 00:57:19 UTC 2016 i686 i686 i686 GNU/Linux
gain@gain:~/Linu
首先来给menuOS 增加两个功能。
test和testAsm。
test代码
FILE *fp = fopen("data.txt","r");
if (fp == NULL) {
fprintf(stderr, "error opening file data.txt in function main()\n");
exit(1);
}
fclose(fp);
printf("Normal Return\n");
是的,你….没…..看…..错……
我用了exit……
我们来看一下menuOS中Quit的代码
int Quit(int argc, char *argv[])
{
/* add XXX clean ops */
}
没错,老师他喵的,没定义,然后我定义了,然后我间接补全了老师系统的功能,
没错,我把quit功能实现了哈哈哈。
分析
嗯,进入调试
由于是exit,然后设置断点。
崩了。。。
换成system_call成断点,又崩了。
中间看了很多代码,但始终没明白原因。
system_call对应汇编代码分析
咳咳,石喵小讲堂开课了。
找到entry32.s
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,4)
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
这段系统调用在内核代码中的工作机制和初始化。
系统 调用对应的处理函数
判断是否需要执行其他的任务syscall_exit_work
当前进程接受到一些信号需要处理,
不需要处理,结束
然后return。
这是一个连贯的过程。内核可以抽象成很多种不同中断处理的综合。