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

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第六周作业>
    这个作业的目标 <深入学习内核系统调用处理过程,用gdb跟踪系统调用内核函数>
    作业正文 https://www.cnblogs.com/houyunzhe/p/13971550.html

    实验过程

    往MenuOS中添加命令

    1.进入LinuxKernel目录下,输入如下命令,先删除之前的menu目录,再下载更新了版本之后的menu目录;

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

    2.进入menu目录之后,生成根目录系统,使用make rootf进入MenuOS;

    -make rootfs
    -MenuOS>>help
    


    使用help命令查看现有的命令

    3.将getpid()函数加入test.c

    4.使用getpid()函数查看pid

    gdb调用内核函数sys_time()

    1.先用如下命令启动内核:

    cd LinuxKernel   //返回LinuxKernel目录
    qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -s -S  //启动内核
    

    2.启动gdb,然后按如下命令先加载3.18.6的内核,然后建立连接,最后在start_kernel函数处设置断点:

    (gdb)file linux-3.18.6/vmlinux
    (gdb)target remote:1234 //建立连接
    (gdb)b start_kernel //在start函数中设置断点
    


    使用list命令查看前后代码:

    3.输入b sys_time设置一个断点,执行后程序停止在sys_time函数处,按s即可继续单步执行。

    system_call流程

    大致来说,system_call()函数首先将系统调用号或中断处理程序需要用到的所有的CPU寄存器保存到相应的栈中,然后进行服务的处理;
    当系统调用服务例程结束时,system_call()函数从eax处获得它的返回值,然后进行一系列的检查,最后恢复用户态进程的执行。

  • 相关阅读:
    win32-LPCSTR->String
    win32-UpdateLayeredWindow
    win32-CreateDIBSection的使用
    win32-StretchDIBits
    hdu1978 简单记忆化搜索
    hdu1978 简单记忆化搜索
    hdu4530 水题
    hdu4530 水题
    hdu3006 状态压缩+位运算+hash(小想法题)
    hdu3006 状态压缩+位运算+hash(小想法题)
  • 原文地址:https://www.cnblogs.com/houyunzhe/p/13971550.html
Copyright © 2011-2022 走看看