• 2020-2021-1 20209321 《Linux内核原理与分析》第六周作业


    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业>
    这个作业的目标 <给MenuOS增加命令,使用gdb跟踪系统调用内核函数sys_time,分析system_call流程示意图,分析系统调用在内核代码中的处理过程>
    作业正文 ... 本博客链接

    系统调用的三层机制(下)

    1.给MenuOS增加命令

    输入以下命令:

    rm -rf menu 删除menu文件

    git clone https://github.com/mengning/menu.git 克隆一个新版本的menu

    cd menu 进入menu目录

    make rootfs

    查看test.c文件,发现增加了2个命令,一个是time,功能是显示系统时间,另一个命令是time-asm,功能是使用汇编方式显示系统时间。

    2.使用gdb跟踪系统调用内核函数sys_time

    启动内核,输入以下命令:

    cd ../ #返回到LinuxKernel目录中

    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s

    启动gdb,把3.18.6的内核加载进来,之后连接到target remote 1234,操作完成后,就连接到了需要调试的MenuOS,输入以下命令:

    file linux-3.18.6/vmlinux

    target remote:1234

    在sys_time处设置断点

    在sys_time断点处停下来后用list查看这段代码

    用gdb的finish命令把这个函数全部执行完,再单步执行,一直到return i,获得的就是当前系统时间time的数值。

    3.system_call流程示意图

    4.系统调用在内核代码中的处理过程

    在用户态有一个系统调用xyz(),xyz()系统调用库函数里面用了sys_call来触发系统调用,即CPU一旦执行到int 0x80指令就会立即跳转到system_call的位置,system_call这一段代码就是系统调用的处理过程,系统调用是一个特殊一点的中断,中断过程都有保护现场(save_all)和恢复现场(restore_all)。代码中的sys_call_table是一个系统调用的表,EAX寄存器传递系统调用号,使用者在调用它时会根据EAX寄存器来调用对应的系统调用内核处理函数,比如EAX寄存器是13,即在调用完sys_time之后需要先保存它的返回值,在退出之前根据需要有一个syscall_exit_work,如果没有,则恢复现场并iret返回用户态。

  • 相关阅读:
    Netty源码剖析-关闭服务
    Netty源码剖析-断开连接
    Netty源码剖析-发送数据
    Netty源码剖析-业务处理
    Netty源码剖析-接受数据
    Netty源码剖析-构建链接
    html中调用silverlight中的方法
    在Silverlight宿主html页面添加按钮无法显示
    win7旗舰版在安装vs2010后向sql2008添加SQL_Server_Management详解
    javascript arguments
  • 原文地址:https://www.cnblogs.com/traceurli/p/13971569.html
Copyright © 2020-2023  润新知