• 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返回用户态。

  • 相关阅读:
    .NET日志系统
    新建elasticsearch 车辆表索引
    mysqlconnectjava.jar下载地址
    mac安装mysql5.7
    window使用logstashinputjdbc同步数据到es
    如何降低node 包版本
    ansible的介绍与hosts文件(一)
    ansible的模块的使用(二)
    爬虫分布式爬虫(未完成)
    前端页面布局链接
  • 原文地址:https://www.cnblogs.com/traceurli/p/13971569.html
Copyright © 2020-2023  润新知