• 2020-2021-1 20209312《Linux内核原理与分析》第九周作业


    作业信息

    这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)>
    这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业>
    这个作业的目标 <学习理解进程的切换和系统的一般执行过程>
    作业正文 https://www.cnblogs.com/ZHANGwg11/p/14087778.html

    1.更新linux/kernel下的menu

    cd LinuxKernel
    rm -rf menu
    git clone https://github.com/mengning/menu.git
    cd menu
    qemu -kernel ../linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
    

    下面是结果的截图:

    设置断点:

    gdb
    file linux-3.18.6/vmlinux
    target remote:1234
    b schedule
    b context_switch
    b switch_to
    b pick_next_task
    


    断点的执行过程:


    2.总结
    硬中断和软中断
    中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程
    引起中断的事件称为中断源。中断源向CPU提出处理的请求称为中断请求。发生中断时被打断程序的暂停点称为断点。CPU暂停现行程序而转为响应中断请求的过程称为中断响应。处理中断源的程序称为中断处理程序。CPU执行有关的中断处理程序称为中断处理。而返回断点的过程称为中断返回。中断的实现由软件和硬件综合完成,硬件部分叫做硬件装置,软件部分称为软件处理程序
    硬中断
    由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。
    软中断
    为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成
    异常
    故障(Fault):出现问题,可以恢复到当前指令。
    退出(Abort):不可恢复的严重故障,导致程序无法继续运行,只能退出。
    陷阱(Trap):程序主动产生的异常。

    进程调度的时机
    进程调度实际就是内核调用schedule函数的时机。简单总结如下:
    用户进程通过特定的系统调用主动让出CPU
    中断处理程序在内核返回用户态进行调度
    内核线程主动调用schedule函数让出cpu
    中断处理程序主动调用schedule函数让出CPU,涵盖以上第一种和第二种情况。

    进程上下文切换
    为了控制进程的执行,内核必须有能力挂起正在CPU上执行的进程,并恢复以前挂起的某个进程的执行,这叫做进程切换、任务切换、上下文切换
    挂起正在CPU上执行的进程,与中断时保存现场是不同的,中断前后是在同一个进程上下文中,只是由用户态转向内核态执行
    进程上下文包含了进程执行需要的所有信息 - 用户地址空间: 包括程序代码,数据,用户堆栈等 - 控制信息 :进程描述符,内核堆栈等
    硬件上下文(注意中断也要保存硬件上下文只是保存的方法不同)
    schedule()函数选择一个新的进程来运行,并调用context_switch进行上下文的切换,这个宏调用switch_to来进行关键上下文切换
    next = pick_next_task(rq, prev);//进程调度算法都封装这个函数内部 - context_switch(rq, prev, next);//进程上下文切换
    switch_to利用了prev和next两个参数:prev指向当前进程,next指向被调度的进程 ##linux系统的一般运行过程
    Linux系统的一般执行过程最一般的情况:正在运行的用户态进程X切换到运行用户态进程Y的过程
    1.正在运行的用户态进程X
    2.发生中断——save cs:eip/esp/eflags(current) to kernel stack,then load cs:eip(entry of a specific ISR) and ss:esp(point to kernel stack).
    3.SAVE_ALL //保存现场
    4.中断处理过程中或中断返回前调用了schedule(),其中的switch_to做了关键的进程上下文切换
    5.标号1之后开始运行用户态进程Y(这里Y曾经通过以上步骤被切换出去过因此可以从标号1继续执行)
    6.restore_all//恢复现场
    7.iret-pop cs:eip/ss:esp/eflags from kernel stack
    8.继续运行用户态进程Y

  • 相关阅读:
    ServiceStack在IIS7中发布后出现403.14错误
    ORACLE 误删除数据恢复
    Xamarin官方示例代码无法部署,提示已跳过部署解决方法
    安装完Oracle之后的注意事项
    在VS2013中使用水晶报表
    ArcObjects10.0MapControl不显示地图内容
    ArcObjects10.0引用控件报错
    ArcGIS Desktop10.2与CityEngine2012兼容问题
    mmo设计
    java nio 网络框架实现
  • 原文地址:https://www.cnblogs.com/ZHANGwg11/p/14087778.html
Copyright © 2020-2023  润新知