如何在 Linux 中查找进程正在哪个环上运行?

如何在 Linux 中查找进程正在哪个环上运行?

如何找出给定进程正在哪个保护环中运行,如果可能的话,我可以生成正在运行的进程及其各自环的列表吗?此线程提供了有关 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例如跟踪内核代码。

相关内容