内核如何知道CPU是处于用户模式还是kenel模式?

Gya*_*yan 14 linux-kernel

由于CPU以用户/内核模式运行,我想知道内核是如何确定的.我的意思是,如果调用了一个sys调用,内核代表进程执行它,但内核如何知道它在内核模式下执行?

Jas*_*son 33

您可以从代码段寄存器(CS)中设置的权限级别判断您是处于用户模式还是内核模式.从RIP或EIP寄存器指向的存储器加载到CPU中的每条指令(指令指针寄存器,取决于您分别是x86_64还是x86)将从当前代码读取全局描述符表(GDT)中描述的段 - 段描述符.代码段描述符的低两位将确定代码正在执行的当前权限级别.当进行系统调用(通常通过软件中断完成)时,CPU将检查当前的权限级别,如果它处于用户模式,则将当前的代码段描述符交换为内核级别描述符,如下所示: syscall的软件中断门描述符,以及堆栈切换并保存当前标志,用户级CS值和RIP值在这个新的内核级堆栈上.当系统调用完成后,用户模式CS值,标志和指令指针(EIP或RIP)值将从内核堆栈中恢复,并且堆栈开关将返回到当前正在执行的进程堆栈.

  • [英特尔开发人员指南](http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html)中记录了保护级别以及如何检测它们,第3A卷,第5章. (5认同)

sts*_*uad 7

从广义上讲,如果它正在运行内核代码,则它处于内核模式.从用户空间到内核模式(例如系统调用)的转换会导致上下文切换.作为此上下文切换的一部分,CPU模式已更改.