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编辑方法,对照片格式进行调整)

  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/j1551163790/p/11741279.html
Copyright © 2011-2022 走看看