zoukankan      html  css  js  c++  java
  • 2020-2021-1 20209307《Linux内核原理与分析》第六周作业

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业>
    这个作业的目标 <使用gdb跟踪分析一个系统调用内核函数,分析system_call对应的汇编代码工作过程>
    作业正文 https://www.cnblogs.com/wzyxiaowang/p/13977300.html

    一、给MenuOS添加命令
    1、删除之前的menu目录,下载新版本目录

    -rm -rf menu
    git clone http://github.com/mengning/menu.git
    

    2、进入menu目录后,生成根目录系统并使用make rootfs进入MenuOS

    3、在test.c文件中新添加Time以及TimeAsm函数

    4、再次使用make rootfs命令,重新编译

    -rootfs
    -MenuOS>>help
    -MenuOS>>Gpid
    

    二、跟踪系统调用内核函数sys_time
    1、进入到LinuxKernel目录,启动内核并冻结

     -cd LinuxKernel
     -qemu -kernel linux-3.18.6/arch/x86/boot/bzImge -initrd rootfs.img -s -S
    

    2、打开新的shell窗口,使用gdb调试,连接1234端口并设置断点

    -(gdb)file linux-3.18.6/vmlinux
    -(gdb)target remote:1234
    -(gdb)b start_kernel
    

    3、用b sys_time命令在sys_time处设置断点,在QEMU终端中输入time后可以看到命令只执行到time函数

    -(gdb)b sys_time
    -(gdb)c
    

    三、实验总结:
    在system_call处设置断点,查看system_call可知,它其实就是系统调用的处理过程,内部没有严格遵守函数调用堆栈基址,不支持gdb的调试,所以MenuOS中仍停留在sys_time。由代码可知,系统调用的过程大致分为三个阶段:保存现场SAVE_ALL、调用系统调用相对应的处理函数如time、getpid等,call *sys_call_table()、恢复现场RESORE_ALL 最后ire结束,返回用户态。在这个过程中,可能 会用到syscall_exit_work,里面有关于进程调度的函数。中断处理是用户态进入内核态的主要方式,系统调用是一种特殊的中断。在系统调用返回之前,可能会发生进程调度(call_schedule),其中可能还会发生中断上下文的切换和进程上下文的切换。

    系统调用过程:

  • 相关阅读:
    iptables
    linux时间同步
    iftop使用
    linux目录结构及定时任务
    awk基本用法
    二、Java面向对象(6)_深入变量
    二、Java面向对象(5)_static修饰符
    二、Java面向对象(4)_构造函数
    二、Java面向对象(3)_类和对象
    二、Java面向对象(2)_软件开发方式
  • 原文地址:https://www.cnblogs.com/wzyxiaowang/p/13977300.html
Copyright © 2011-2022 走看看