linux用户栈和内核栈

来源:互联网 发布:淘宝详情图片格式 编辑:程序博客网 时间:2024/06/07 20:49

        进程是正在执行中的程序,每个进程都有自己的堆栈。在进程初始化申请task_structure的时候也会申请堆栈空间,共有两个堆栈,内核堆栈和用户堆栈。内核堆栈指向内核地址空间,用户堆栈指向用户地址空间。当运行在用户态的时候cpu的栈指针指向的是用户堆栈,而当cpu运行在内核态的时候,cpu的栈指针指向的是内核栈。

       其中用户堆栈就是在进程执行中存放变量和函数参数等的堆栈。当进程由于中断或系统调用从用户态转换到内核态时,进程所使用的栈也要从用户栈切换到内核栈。系统调用实质就是通过指令产生中断,称为软中断。进程因为中断(软中断或硬件产生中断),使得CPU切换到特权工作模式,此时进程陷入内核态,进程进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址为内核栈地址,这样就完成了用户栈向内核栈的切换。

      在进程转入内核态之后,执行的代码是内核代码,但执行路径未必相同,导致数据压栈的顺序和内容不同。另外数据不能保存在用户空间,这样容易被覆盖和修改,这时就需要为每个进程专门准备一套内核栈。

      当中断执行完成时,会将内核态执行的结果返回给用户态(例如系统调用),然后健用户堆栈的地址返回给堆栈指针寄存器。

0 0