![如何在 Linux 中查找进程正在哪个环上运行?](https://linux22.com/image/124645/%E5%A6%82%E4%BD%95%E5%9C%A8%20Linux%20%E4%B8%AD%E6%9F%A5%E6%89%BE%E8%BF%9B%E7%A8%8B%E6%AD%A3%E5%9C%A8%E5%93%AA%E4%B8%AA%E7%8E%AF%E4%B8%8A%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
如何找出给定进程正在哪个保护环中运行,如果可能的话,我可以生成正在运行的进程及其各自环的列表吗?此线程提供了有关 x86 处理器上使用的环的一些见解:https://stackoverflow.com/questions/18717016/what-are-ring-0-and-ring-3-in-the-context-of-operating-systems
我想知道如何找出自己正在运行哪些保护环级进程,而不是给出有关环进程的描述将要正在运行(尽管您可以根据需要包含它)。
答案1
在x86,当前权限级别为由底部两位确定代码段选择器的,IECS 寄存器中存储的值。因此,要确定进程的当前特权级别,您所需要做的“所有”操作就是查看其 CS 寄存器的值。
你可以很容易地为你自己的程序做到这一点(假设 64 位x86):
#include <stdint.h>
#include <stdio.h>
int main (int argc, char **argv) {
uint64_t rcs = 0;
asm ("mov %%cs, %0" : "=r" (rcs));
printf("%d\n", (int) (rcs & 3));
return 0;
}
对于其他进程,您必须使用类似的方法附加到它们ptrace
,并检查它们的寄存器。您可以使用 手动执行此gdb
操作:识别一个进程,使用 附加到该进程(如果允许)gdb --pid ...
,然后发出gdb
命令 info registers cs
以查看 CS 的当前值,并提取最低有效两位的值。
在 Linux 上x86您很快就会看到当前权限级别始终为 3:用户进程始终在环 3 中运行,除非它们处于系统调用中(在环 0 中运行),但您将无法在环中看到它们0 外部,除非通过使用ftrace
例如跟踪内核代码。