第五周

标签(空格分隔): 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代码


 
  1. FILE *fp = fopen("data.txt","r");
  2. if (fp == NULL) {
  3. fprintf(stderr, "error opening file data.txt in function main()\n");
  4. exit(1);
  5. }
  6. fclose(fp);
  7. printf("Normal Return\n");

是的,你….没…..看…..错……
我用了exit……
我们来看一下menuOS中Quit的代码


 
  1. int Quit(int argc, char *argv[])
  2. {
  3. /* add XXX clean ops */
  4. }

没错,老师他喵的,没定义,然后我定义了,然后我间接补全了老师系统的功能, 23.png
没错,我把quit功能实现了哈哈哈。

分析

嗯,进入调试
start_kernel_qemu.png

由于是exit,然后设置断点。
2016-03-23 21-37-24屏幕截图.png
崩了。。。
23.png
换成system_call成断点,又崩了。2016-03-23 21-39-42屏幕截图.png
中间看了很多代码,但始终没明白原因。

system_call对应汇编代码分析

咳咳,石喵小讲堂开课了。

找到entry32.s


 
  1. ENTRY(system_call)
  2. RING0_INT_FRAME # can't unwind into user space anyway
  3. ASM_CLAC
  4. pushl_cfi %eax # save orig_eax
  5. SAVE_ALL
  6. GET_THREAD_INFO(%ebp)
  7. # system call tracing in operation / emulation
  8. testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
  9. jnz syscall_trace_entry
  10. cmpl $(NR_syscalls), %eax
  11. jae syscall_badsys
  12. syscall_call:
  13. call *sys_call_table(,%eax,4)
  14. syscall_after_call:
  15. movl %eax,PT_EAX(%esp) # store the return value
  16. syscall_exit:
  17. LOCKDEP_SYS_EXIT
  18. DISABLE_INTERRUPTS(CLBR_ANY) # make sure we don't miss an interrupt # setting need_resched or sigpending # between sampling and the iret
  19. TRACE_IRQS_OFF
  20. movl TI_flags(%ebp), %ecx
  21. testl $_TIF_ALLWORK_MASK, %ecx # current->work
  22. jne syscall_exit_work

这段系统调用在内核代码中的工作机制和初始化。
系统 调用对应的处理函数

判断是否需要执行其他的任务syscall_exit_work
当前进程接受到一些信号需要处理,


不需要处理,结束
然后return。


这是一个连贯的过程。内核可以抽象成很多种不同中断处理的综合。

转载于:https://www.cnblogs.com/gain/p/5313323.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值