美文网首页
进程内核栈、用户栈

进程内核栈、用户栈

作者: Hope_加贝 | 来源:发表于2019-03-14 20:00 被阅读0次

1.1. 进程的堆栈

内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。
当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;
当进程在内核空间运行时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

1.2. 进程用户栈和内核栈的切换

当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。

进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态之行时,在内核态之行的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。

那么,我们知道从内核转到用户态时用户栈的地址是在陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,我们是如何知道内核栈的地址的呢?

关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信心,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了

相关文章

  • 进程内核栈、用户栈

    在Linux系统中,每一个用户进程都有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户...

  • 进程内核栈、用户栈

    1.1. 进程的堆栈 内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会...

  • CPU上下文切换

    栈空间 用户态函数栈主要用于用户态的函数调用image.png 内核栈Linux 给每个 task 都分配了内核栈...

  • 2. 进程栈和线程栈

    Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈 - 木易博客专栏 - CSDN博客 栈的作用:函数调用和多...

  • 用户栈和内核栈

    为了区分程序的运行级别,有用户态和核心态之分,也叫目态和管态。硬件驱动、CPU和内存管理等底层操作和进程管理、诊断...

  • 用户态协议栈之epoll实现原理

    用户态协议栈,为什么要实现epoll?因为内核的epoll是跟内核协议栈一起使用的,内核协议栈处理io后通过回调的...

  • 用户栈与内核栈有什么区别

    内核在创建进程时,会同时创建task_struct和进程相应堆栈。每个进程都会有两个堆栈,一个用户栈,存在于用户空...

  • 操作系统面试复习点

    堆和栈的区别 浮点数在内存中存放方式 内存对齐 进程vs线程 内核态 vs 用户态 进程调度算法 进程间通信的几种...

  • Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    栈是什么?栈有什么作用? 首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (...

  • 基于MIT6.828 分析 linux 从用户态到内核态用户栈和

    基于MIT6.828课程的Lab3,我们来分析一下程序从用户态到内核态中用户栈内核栈切换的过程。 你需要具备: M...

网友评论

      本文标题:进程内核栈、用户栈

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