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

    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业>
    这个作业的目标 <理解进程调度的时机和进程切换的过程>
    作业正文 ...https://www.cnblogs.com/matahh/p/14076658.html

    1.实验目的
    (1)理解Linux系统中进程调度的时机,可以在内核代码中搜索schedule()函数,看都是哪里调用了schedule()。
    (2)使用gdb跟踪分析一个schedule()函数 ,验证您对Linux系统进程调度与进程切换过程的理解;
    (3)特别关注并仔细分析switch_to中的汇编代码,理解进程上下文的切换机制,以及与中断上下文切换的关系;
    2.实验内容
    配置运行MenuOS系统

    配置gdb远程调试和设置断点



    使用gbd跟踪分析了schedule()函数,pick-next-task函数是schedule函数中重要的函数,负责根据调度策略和调度算法选择下一个进程。
    context-switch是schedule函数中实现进程切换的函数,context_switch函数中进行进程关键上下文切换的函数。
    3.实验分析




    分析switch_to中的汇编代码:
    1 把prev和next分别保存在寄存器中,即寄存器传参
    movl prev,%eax
    movl next,%edx
    2 把eflags和ebp保存在当前的堆栈中
    pushfl
    pushl %ebp
    3 把esp的内容保存到prev->thread.esp中,以使该字段指向prev内核栈的栈顶
    ovl %esp,484(%eax)
    注:484(%eax) ,表示内存但愿的地址=(%eax) + 484
    4 把next->thread.sp装入esp,内核开始在next的指令空间中操作,这条指令完成了进程之间的切换。
    可以会想thread_info数据结构,内核栈和进程描述符组成的8K的数据结构
    movl 484(%edx),%esp
    5 把标记为1f的地址存入prev->thread.eip,即被替换出的进程在下次被schedule()选择执行时,从这条指令开始执行
    movl $1f,480(%eax)
    6 把next->thread.eip(绝大多数情况是一个被标记为1的地址)的值压入next的内核栈
    pushl 480(%edx)
    7 跳到__swtich_to() c语言函数开始执行
    jmp __swtich_to
    8 这里被进程next替换的进程prev再次获得CPU:它执行一些保存eflags和ebp的寄存器内容指令,这两条指令的第一条指令被标记为1
    参考文章(https://blog.csdn.net/ustc_dylan/article/details/4064627)

  • 相关阅读:
    The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色
    insert into,insert into select,replace into,replace into select,insert ignore into,on duplicate key update
    mysql使用指南
    openssl使用
    黑名单
    zsh+iTerm2+ powerline+oh-my-zsh+ agnoster
    mac安装brew软件管理工具
    mysql性能优化
    numactl
    vscode
  • 原文地址:https://www.cnblogs.com/matahh/p/14076658.html
Copyright © 2011-2022 走看看