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

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

    往MenuOS中添加命令

    1.应实验要求,先删除之前的menu目录,再下载更新了版本之后的menu目录

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

    2.进入menu目录之后,生成根目录系统,使用make rootf进入MenuOS,并使用help命令查看现有的命令

        -make rootfs
        -MenuOS>>help
    

    3.在test.c文件中添加第五周作业的getpid()函数

        -sudo gedit test.c
    

    4.再次使用make rootfs命令,将根目录系统重新编译,将命令添加进去,可以看到,命令添加成功

        -rootfs
        -MenuOS>>help
        -MenuOS>>Gpid
    
    ##使用gdb跟踪系统调用内核函数sys_time

    1.进入到LinuxKernel目录,启动内核,并冻结

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

    2.使用水平分割,打开一个shell窗口,使用gdb调试,打开vmlinux,连接1234端口,并在start_kernel处设置断点

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

    3.在sys_time处设置断点,并c继续调试,可在QEMU看到程序停到了time函数

        -(gdb)b sys_time
        -(gdb)c
    

    4.使用list命令查看函数详情,并使用s命令单步调试

        -(gdb)list
        -(gdb)s
    

    分析system_call代码对应的工作过程

    在system_call处设置断点,查看system_call可知,它其实就是系统调用的处理过程,内部没有严格遵守函数调用堆栈基址,不支持gdb的调试,所以MenuOS中仍停留在sys_time

    以下是系统的调用流程

    总结

    本实验中,我掌握如何实现MenuOS功能的扩展,并知道了如何去增加系统的调用。我还了解到当我们执行int x80时,CPU会自动跳转到system_call函数,所以实验中我们可以直接把断点设置到system_call,system_call的实现是在linux-3.18.6/arch/x86/kernel/entry_32S,是汇编代码。当我们从系统调用处理过程的入口开始,就可以看到SAVE_ALL保存现场,然后找到system_call和sys_call_table,函数调用后通过restore_all和最后一个INTERRUPT_RETURN(iret)恢复现场并返回系统调用到用户态结束。(不同于之前的博客,我再一次学习了Markdown编辑方法,对照片格式进行调整)

  • 相关阅读:
    使用Logstash把MySQL数据导入到Elasticsearch中
    通过Metricbeat实现外部对Elastic Stack的监控
    使用Elasticsearch的processors来对csv格式数据进行解析
    redis学习网址
    部署文件:filebeat->kafka集群(zk集群)->logstash->es集群->kibana
    ios实例开发精品文章推荐(8.13)
    ios实例开发精品文章推荐(8.12)11个处理触摸事件和多点触摸的JS库
    Android开发环境——模拟器AVD相关内容汇总
    Android开发环境——Eclipse ADT相关内容汇总
    Android开发环境——SDK相关内容汇总
  • 原文地址:https://www.cnblogs.com/j1551163790/p/11741279.html
Copyright © 2011-2022 走看看