进程的内核栈、用户栈

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

1.进程的堆栈

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

用户栈:存在于用户空间

内核栈:存在于内核空间

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

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

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

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

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

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

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

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

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

By 一枝猪

原文地址:https://www.cnblogs.com/chunzhulovefeiyue/p/6591274.html