您的位置:首页 > 运维架构 > Linux

《Linux内核分析》 第五节 扒开系统调用的三层皮(下)

2016-03-26 13:32 507 查看

《Linux内核分析》第五节扒开系统调用的三层皮(下)

20135307

一、给MenusOS增加time和time-asm命令

给MenuOS增加time和time-asm命令需要

更新menu代码

在main函数中增加menuconfig

增加对应的time和timeasm函数

makerootfs

二、使用GDB跟踪系统调用内核函数sys_time

实验报告

分析system_call中断处理过程

使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl,推荐在实验楼Linux虚拟机环境下完成实验。

根据本周所学知识分析系统调用的过程,从system_call开始到iret结束之间的整个过程,并画出简要准确的流程图

博客内容的具体要求如下:

题目自拟,内容围绕系统调用system_call的处理过程进行;

博客内容中需要仔细分析system_call对应的汇编代码的工作过程,特别注意系统调用返回iret之前的进程调度时机等。

总结部分需要阐明自己对“系统调用处理过程”的理解,进一步推广到一般的中断处理过程

用实验楼的虚拟机打开shell,更新menu,给MenuOS增加Pid和PidAsm

cdLinuxKernel rmmenu-rf gitclonehttps://github.com/mengning/menu.gitcdmenu vitest.c makerootfs


  

使用gdb跟踪分析

qemu-kernellinux-3.18.6/arch/x86/boot/bzImage-initrdrootfs.img-s-S

  

gdb filelinux-3.18.6/vmlinux加载调试用的符号表 targetremote:1234 bstart_kernel设置断点 c bsys_getpid

  

分析内核调用汇编代码

ENTRY(system_call) RING0_INT_FRAME#can'tunwindintouserspaceanyway ASM_CLAC pushl_cfi%eax#saveorig_eax SAVE_ALL GET_THREAD_INFO(%ebp) #systemcalltracinginoperation/emulation testl$_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp) jnzsyscall_trace_entry cmpl$(NR_syscalls),%eax jaesyscall_badsys syscall_call: call*sys_call_table(,%eax,4) syscall_after_call: movl%eax,PT_EAX(%esp)#storethereturnvalue syscall_exit: LOCKDEP_SYS_EXIT DISABLE_INTERRUPTS(CLBR_ANY)#makesurewedon'tmissaninterrupt #settingneed_reschedorsigpending #betweensamplingandtheiret TRACE_IRQS_OFF movlTI_flags(%ebp),%ecx testl$_TIF_ALLWORK_MASK,%ecx#current->work jnesyscall_exit_work restore_all: TRACE_IRQS_IRET restore_all_notrace: #ifdefCONFIG_X86_ESPFIX32 movlPT_EFLAGS(%esp),%eax#mixEFLAGS,SSandCS #Warning:PT_OLDSS(%esp)containsthewrong/randomvaluesifwe #arereturningtothekernel. #Seecommentsinprocess.c:copy_thread()fordetails. movbPT_OLDSS(%esp),%ah movbPT_CS(%esp),%al andl$(X86_EFLAGS_VM|(SEGMENT_TI_MASK<<8)|SEGMENT_RPL_MASK),%eax cmpl$((SEGMENT_LDT<<8)|USER_RPL),%eax CFI_REMEMBER_STATE jeldt_ss#returningtouser-spacewithLDTSS #endif restore_nocheck: RESTORE_REGS4#skiporig_eax/error_code irq_return: INTERRUPT_RETURN

  实验截图







从系统调用到中断返回的函数流程图



总结

当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如I/O操作,修改基址寄存器内容等指令,而当处理完系统调用内容后,操作系统会让处理器返回用户模式,来执行用户代码。当系统调用完成后,把控制权交回到发起调用的用户进程前,内核又会有一次调度。如果发现有优先级更高的进程或当前进程的时间片用完,那么会选择优先级更高的进程或重新选择进程执行.


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: