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

标签 linux-kernel

由于CPU在用户/内核模式下运行,我想知道这是如何由内核决定的。我的意思是,如果调用 sys 调用,内核会代表进程执行它,但是内核如何知道它是在内核模式下执行的呢?

最佳答案

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

关于linux-kernel - 内核如何知道 CPU 处于用户模式还是内核模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223813/

相关文章:

c++ - 需要非常小的开源内核

c - Linux内核中wake_up_sync/wake_up_interruptible_sync的用途

linux - 跟踪连接和数据包到套接字(linux 网络)?

c - 为什么 Linux 内核使用它所使用的数据结构?

linux - checkpatch.pl 标记八进制权限错误

linux - 为什么 make savedefconfig 删除条目?

linux - 为什么在 Linux 中做 I/O 是不间断的?

linux - 在 RPI3/ModelB 上实现 CPU 热插拔的系统调用

c - 在Linux的net/ipv4/udp.c中,为什么UDP数据包需要通过xfrm4_policy_check()来处理?

linux - 刷新缓存和TLB不起作用: flush_cache_mm(mm)/flush_tlb_mm(mm)