linux中用户栈与内核栈有什么区别

linux中用户栈与内核栈有什么区别
内核在创建进程时会同时创建task_struct和进程相应堆栈。每个进程都会有两个堆栈一个用户栈存在于用户空间一个内核栈存在于内核空间。当进程在用户空间运行时CPU堆栈寄存器的内容是用户堆栈地址使用用户栈。当进程在内核空间时CPU堆栈寄存器的内容是内核栈地址空间使用的是内核栈。当进程因为中断或系统调用进入内核时进程使用的堆栈也需要从用户栈到内核栈。进程陷入内核态后先把用户堆栈的地址保存到内核堆栈中然后设置设置CPU堆栈寄存器为内核栈的地址这样就完成了用户栈到内核栈的转换。当进程从内核态恢复到用户态时把内核中保存的用户态堆栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈到用户栈的转换。注意陷入内核栈时如何知道内核栈的地址呢进程由用户栈到内核栈转换时进程的内核栈总是空的。每次从用户态陷入内核时得到的内核栈都是空的所以在进程陷入内核时直接把内核栈顶地址给堆栈指针寄存器即可。