zoukankan      html  css  js  c++  java
  • 进程的内核栈、用户栈

    今天在看Coursera的时候看到了用户栈,困惑不解,就从网上收集了一些资料,做一个总结。

    1.进程的堆栈

    内核在创建进程时,会为其创建相应的堆栈,分别是用户栈和内核栈

    用户栈:存在于用户空间

    内核栈:存在于内核空间

    当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户堆栈的地址,当前为使用用户栈。

    当进程在内核空间运行时,CPU堆栈指针寄存器里面的内容是内核栈空间地址,当前为使用内核栈。

    2.用户栈与内核栈之间的切换

    进程可以通过中断或者系统调用而陷入内核中,进程所使用的堆栈也要从用户栈转到内核栈。

    当进程陷入内核态以后,先把用户堆栈的地址保存在内核栈之中,通过设置堆栈指针寄存器的内容(将它指向内核栈的地址方可)来完成从用户栈到内核栈的转换;

    当进程从内核态转换到用户态时,在内核栈中的用户栈的地址恢复到堆栈指针寄存器即可。

    通过上述的操作,便实现了操作系统中的进程之间的内核态与用户态的转换。

    最后,我还有一点想要强调的就是

    进程从用户态转换到内核态时,内核栈总是空的!这是因为一旦进程从内核态返回到用户态以后,内核栈的信息就会失效,会被全部的恢复,所以每次进程从用户态陷入内核态的时候得到的内核栈都是空的。这样以来,在陷入内核态的过程中,我们可以通过把内核栈的栈顶指针给堆栈指针寄存器就可以了。

    By 一枝猪

  • 相关阅读:
    摆花
    关于我的博客
    博客美化更新日志
    页面美化代码1.x
    本人已转至新博客!
    回归博客园
    退役快乐
    Luogu神贴合辑
    代码高亮预览
    NOIp2018普及组初赛解题报告
  • 原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/6591274.html
Copyright © 2011-2022 走看看