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

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

    1.进程的堆栈

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

    用户栈:存在于用户空间

    内核栈:存在于内核空间

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

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

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

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

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

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

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

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

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

    By 一枝猪

  • 相关阅读:
    汽车知识图谱
    医疗知识图谱与自动问答
    MongoDB(单节点)环境配置
    【字符串-01】
    【双指针-01】
    【排序-01】十大排序算法(Python实现)
    【队列-01】队列题目解析
    【栈-01】栈题目解析
    【贪心-02】贪心算法题目解析
    【贪心-01】贪心算法原理介绍
  • 原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/6591274.html
Copyright © 2011-2022 走看看