《Linux内核分析》 week5作业-system call中断处理过程

一.使用gdb跟踪分析一个系统调用内核函数

1.在test.c文件中添加time函数与采用c语言内嵌汇编的time函数.具体实现请看下图.

2.然后在main函数中添加MenuConfig函数,进行注册。这样当Menuos运行起来时,界面就会多出time与time-asm选项。

3.通过make rootfs命令运行

采用gdb调试的过程

  • qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S
  • gdb
  • file linux-3.18.6/vmlinux
  • target remote:1234
  • b start_kernel
  • b sys_time

gdb单步调试命令n,继续运行c,跳入函数内核s.

二.分析system_call代码的执行过程

当用户调用一个系统调用时,系统会自动通过int $0x80进入内核,同时通过中断向量进入system_call函数.然后开始执行system_call过程。

490ENTRY(system_call)
491    RING0_INT_FRAME            # can‘t unwind into user space anyway
492    ASM_CLAC
493    pushl_cfi %eax            # save orig_eax
494    SAVE_ALL                        #保存寄存器上下文环境
495    GET_THREAD_INFO(%ebp)
496                    # system call tracing in operation / emulation
497    testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%ebp)
498    jnz syscall_trace_entry
499    cmpl $(NR_syscalls), %eax
500    jae syscall_badsys
501syscall_call:
502    call *sys_call_table(,%eax,4)  #通过eax寄存器存储的具体系统调用号来去system_call表中去执行具体的系统调用
503syscall_after_call:
504    movl %eax,PT_EAX(%esp)        #系统调用执行完之后用eax保存返回值
505syscall_exit:
506    LOCKDEP_SYS_EXIT
507    DISABLE_INTERRUPTS(CLBR_ANY)    # make sure we don‘t miss an interrupt
508                    # setting need_resched or sigpending
509                    # between sampling and the iret
510    TRACE_IRQS_OFF
511    movl TI_flags(%ebp), %ecx
512    testl $_TIF_ALLWORK_MASK, %ecx    # current->work,判断当前是否需要继续执行syscall_exit_word过程
513    jne syscall_exit_work    #若需要,则进入syscall_exit_work过程
514
515restore_all:
516    TRACE_IRQS_IRET   #恢复上下文环境 

这段代码的总体流程就是:

  • 保存当前进程环境(SAVE_ALL)
  • 执行具体的系统调用,并保存返回值
  • 判断当前是否还需要执行其他的任务(即syscall_exit_work).
  • 恢复上下文环境。

接下来具体看看syscall_exit_work执行了哪些具体任务

656syscall_exit_work:
657    testl $_TIF_WORK_SYSCALL_EXIT, %ecx
658    jz work_pending                  #进入work_pending
659    TRACE_IRQS_ON
660    ENABLE_INTERRUPTS(CLBR_ANY)    # could let syscall_trace_leave() call
661                    # schedule() instead
662    movl %esp, %eax
663    call syscall_trace_leave
664    jmp resume_userspace
665END(syscall_exit_work)

work_pending的主要工作是判断当前进程是否有信号或者进程通信的任务来处理。

593work_pending:
594    testb $_TIF_NEED_RESCHED, %cl
595    jz work_notifysig   #如果有信号处理,则进入work_notifysig过程
596work_resched:
597    call schedule           #是否需要进行进程调度,如果有进程调度的任务,则进入
598    LOCKDEP_SYS_EXIT
599    DISABLE_INTERRUPTS(CLBR_ANY)    # make sure we don‘t miss an interrupt
600                    # setting need_resched or sigpending
601                    # between sampling and the iret
602    TRACE_IRQS_OFF
603    movl TI_flags(%ebp), %ecx
604    andl $_TIF_WORK_MASK, %ecx    # is there any work to be done other
605                    # than syscall tracing?
606    jz restore_all                #返回进行上下文
607    testb $_TIF_NEED_RESCHED, %cl
608    jnz work_resched
609

因此在进程执行完某个系统调用的过程后,在返回值之前,会检查是否进程有信号需要处理和是否有进程调度的任务需要执行。

三.实验总结

更加进一步地深入学习了在用户调用一个系统调用时,内核底层的执行过程。

时间: 2024-10-07 08:55:53

《Linux内核分析》 week5作业-system call中断处理过程的相关文章

Linux内核分析第五周作业

分析system_call中断处理过程 这次的目标是通过gdb来跟踪上周选择的uname系统调用.因为系统调用是通过中断在内核态实现的,gdb无法调试本机的系统调用.所以必须像之前的内核跟踪那样,用gdb远程连接至qemu虚拟机进行跟踪. 1. 首先修改之前的MenuOS,添加一个myuname函数通过API的方式调用uname系统调用,直接复制了上周的代码,注意要在main函数中把这个函数添加到菜单中 用make命令编译以后,会生成一个test的可执行文件,可以先在本地运行试一试 可以看到命令

魏昊卿——《Linux内核分析》第三周作业:Linux系统启动过程

魏昊卿——<Linux内核分析>第三周作业:Linux系统启动过程 一.实验部分 实验指导 使用实验楼的虚拟机打开shell 1 cd LinuxKernel/ 2 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 内核启动完成后进入menu程序(<软件工程C编码实践篇>的课程项目),支持三个命令help.version和quit,您也可以添加更多的命令,对选修过<软件工程C编码实践篇>

Linux内核分析作业 NO.2

操作系统是如何工作的 于佳心 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  本章所学内容主要围绕着三个方面. 1.函数调用堆栈 2.中断机制 3.mykernel上实际操作构建内核 操作系统的三个法宝指的是:存储程序计算机,函数调用堆栈,中断机制 其中函数调用堆栈是高级语言的起点,它的作用是记录调用路径和参数(调用框架,传递参数,保存返回地址,提供局部变量空间) 这里涉及到了esp,

Linux内核分析作业 NO.8 完结撒花~~~

进程的切换和系统的一般执行过程 于佳心  原创作品转载请注明出处  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程切换的关键代码switch_to分析 进程的调度时机与进程的切换 不同类型的进程有不同的调度需求 第一种分类: I/0-bound:频繁的进程I/0,通常会花费很多时间等待I/O操作的完成 CPU-bound:计算密集型,需要大量的CPU时间进行运算 第二种分类:批处理进程,实时进程,交互性进

魏昊卿——《Linux内核分析》第二周作业:了解操作系统是怎样工作的

魏昊卿——<Linux内核分析>第二周作业:了解操作系统是怎样工作的 一.实验部分 使用实验楼的虚拟机打开shell cd LinuxKernel/linux-3.9.4 qemu -kernel arch/x86/boot/bzImage 然后cd mykernel 您可以看到qemu窗口输出的内容的代码mymain.c和myinterrupt.c 使用自己的Linux系统环境搭建过程参见mykernel,其中也可以找到一个简单的时间片轮转多道程序内核代码 mymain.c myinterr

Linux内核分析—实验五分析system_call中断处理过程

郑斌 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 使用gdb跟踪分析一个系统调用内核函数(您上周选择的那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl ,推荐在实验楼Linux虚拟机环境下完成实验. 根据本周所学知识分析系

linux内核分析作业3:跟踪分析Linux内核的启动过程

内核源码目录 1. arch:录下x86重点关注 2. init:目录下main.c中的start_kernel是启动内核的起点 3. ipc:进程间通信的目录 实验 使用实验楼的虚拟机打开shell cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initr

Linux内核分析作业(1)——计算机是如何工作得?

根据163MOOC学院中国科学技术大学孟宁孟老师课程所写得博客 作者:肖冲冲 原创作品请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一,计算机的工作过程 计算机的基本原理是存储程序和程序控制(冯﹒诺依曼体系),简单来说,我们需要先把需要进行操作的指令(程序)和数据先输入到计算机的存储设备中,然后计算机将严格执行需要执行的指令,包括从那个地址取数(或指令),进行什么操作(加减移位等),然后再送回到什

《linux内核分析》第二次课 实验作业

潘聪  原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 这次的实验主要是研究线程调度中的主动调度. --------------------------------------------- 一.基础结构 (1)进程:在mypcb.h中,进程由ip(eip)和sp(esp)共同组成. (2)进程控制块(PCB):进程号pid,状态(错误/运行中/停止运行),进程堆栈(包括内核栈和用户栈,