进程的堆栈:每个进程都有自己的堆栈,内核在创建一个新的进程是,在创建进程控制块task_struct的同时,也为进程创建自己的堆栈,一个进程有2个堆栈:用户堆栈、系统堆栈(内核堆栈)。
用户堆栈和内核堆栈的切换:当进程由于中断或系统调用从用户态到内核态时,进程所用的栈也要从用户堆栈切换到内核堆栈。系统调用实质就是通过指令产生中断,成为软中断。进程因为中断(软中断或硬件产生中断)使得CPU切换到特权工作模式,此时进程陷入内核态。进程进入内核态后,首先把用户态的堆栈地址保存在内核堆栈中,然后设置堆栈指针寄存器的地址内核栈地址,这样就完成了用户栈向内核栈的切换。当进程从内核态切换到用户态时,最后把保存在内核栈中的用户堆栈地址恢复到CPU栈指针寄存器即可,这样就完成了内核栈向用户栈的切换。