
Unknown.jpg
为了区分程序的运行级别,有用户态和核心态之分,也叫目态和管态。硬件驱动、CPU和内存管理等底层操作和进程管理、诊断测试相关程序运行在核心态。而部分文件系统、网络参数设置和编辑功能运行在用户态。
Intel CPU提供Ring0 ~ Ring3共4种级别的运行模式。Ring0级别最高,Ring3级别最低。
用户栈和内核栈对应一个进程在上述两种环境下运行的工作数据结构。每个进程都有这两种栈:用户栈存在用户空间;内核栈存在内核空间。当进程在用户空间运行时,堆栈寄存器的内容就是用户堆栈地址,反之是内核堆栈地址。
当系统因系统调用或中断由用户态切换到内核态时,进程使用的用户栈也要变成自己的内核栈。进程陷入内核态后,先把用户态堆栈的地址保存在内核栈中,然后将堆栈寄存器的内容置为内核栈地址,完成用户态到内核态的转换。当内核任务完成要回到用户态时,把内核栈中的用户栈地址弹给堆栈寄存器即可。
那么在进入内核态时,我们是怎么知道内核栈的地址呢? 答案是,当我们在用户态下运行时,内核栈是空的。在内核态运行时,内核栈负责保存进程信息,一旦返回用户态,内存中保存的信息无效,会全部恢复,因此每次刚进入内核态,内核栈是空的,也只需要把内核栈的栈顶弾给堆栈寄存器。