美文网首页学习
Linux内核——系统运行过程

Linux内核——系统运行过程

作者: 懒无趣 | 来源:发表于2020-12-30 23:12 被阅读0次

    系统一般执行过程

    1. 正运行在用户态的X进程
    2. X进程发生中断(可能产生了系统调用、异常等)
      • 保存CS:EIPSS:ESPeflags寄存器到X进程内核堆栈
      • 加载CS:EIP到中断处理函数入口,加载SS:ESP到X进程内核堆栈
      • 以上两点是int 0x80系统指令完成的
    3. 中断处理函数中一段汇编指令SAVE_ALL,将X进程用户态硬件上下文信息全部保存起来到内核堆栈,此时进程X运行在内核态
    4. 当系统调用函数执行完成,在中断返回之前中断处理函数会固定调用schedule()函数,使用switch_to()函数进行进程上下文的切换,此时CS:EIP寄存器切换至Y进程的指令地址(next->thread.ip,即:1f,在之前的文章进程切换中有说明)
    5. 切换至Y进程的内核态中,由于此前进程Y被调度出去,保持了1f地址到(prev->thread.ip),那么Y进程从这里开始执行,恢复内核堆栈信息,其中内核堆栈保存了函数调用过程,继续执行schedule()函数调用后的代码,RESOTRE_ALL() 和 iret(对于上面第2、3点),iret后将Y的CS:EIPSS:ESP等硬件上下文都恢复到用户态之后继续执行用户态代码段代码。

    进程中断 和 进程上下文切换区别

    进程中断

    进程中断是某一个进程的CPU硬件上下文的切换,将CS:EIPSS:ESP等寄存器切换到内核函数地址和内核堆栈地址等,从此至终(从用户态->内核态->用户态,若没有发生进程调度)都是同一个进程在运行,即PCB进程控制块在内核中等同一个,只是部分CPU硬件上下文有变化

    进程上下文切换

    进程上下文切换是两个进程之间等切换,它包括内存寄存器等切换(CR3),两个进程等内核堆栈、EIP寄存器等切换等等。内核进程控制块由prev切换到next(由于内核ESP寄存器切换,get_current_thread 函数返回的就是next进程的进程控制块信息)

    相关文章

      网友评论

        本文标题:Linux内核——系统运行过程

        本文链接:https://www.haomeiwen.com/subject/ywykoktx.html