如何判定一个进程是用户态或者内核态

如题所述

对于一个处于RUNNING状态的进程, 如果此时它没有占用CPU, 则在上次发生进程切换时, 它可能运行于用户态或内核态.
假设在发生进程切换时它运行于内核态, 那它可能是通过系统调用或者是异常(如缺页异常)的方式进入到内核态的.
又假设在发生进程切换时它运行于用户态, 那它只能是通过中断进入到内核态. 进而被切换掉.
而通过中断 系统调用或异常这三种方式进入到内核态时, 有一个不同之处就在于在压栈时, 内核栈中的出错代码那个地方.
如果是由于中断进入到内核, 那么在该进程的内核栈的EIP指针下面压入栈的值应该是 (中断号-256)
而如果是由于异常进入到内核的, 那么在该位置处, 压入栈的值应该是异常的出错代码, 并且在压栈时会将其再设置为-1; 如果是由于系统调用进入到内核的, 那么在该位置处, 其值为系统调用号.
温馨提示:答案为网友推荐,仅供参考