获取进程的当前权限级别(环)

获取进程的当前权限级别(环)

我正在研究虚拟机及其运行的环。从文档中,有时很难找到这一点。因此,我想运行虚拟机,然后查看进程并查看它们在哪个环中运行。

根据博客文章古斯塔沃·杜阿尔特CPL寄存器由处理器根据进程的环来设置。在这里@Stephen Kitt 提到有可能性。使用gdb 的解决方案返回如提到的寄存器值Ring3。我已经尝试过类似ModemManager或我认为在 Ring0 中运行的进程iwlwifi,但它们都返回 Ring3 作为其 cs 寄存器内容。

建议的方法是使用ftrace.但这个程序非常复杂,我找不到教程。有人知道获取流程的 CS 的神奇方法吗?

还有其他方法从 CS 寄存器中检索值吗?

答案1

在 x86 上,实际上不需要其他方法来确定进程正在哪个环中运行,因为 CS 寄存器完全确定活动环。由于您正在运行虚拟机,根据您拥有的虚拟机管理程序,可以使用其中的调试功能从外部查看虚拟机内部虚拟 CS 的当前值。

在正在运行的系统中检索 CS 值的一个大问题是 CS 的值将是完全由用于检索值的探针的性质决定。如果您使用用户空间探针,您将始终看到与用户空间相对应的值;如果您使用内核级探针(探针或者追踪),您将始终看到与内核空间相对应的值。

无论如何,在裸机上的 Linux 上,情况非常简单:用户代码在环 3 中运行,内核在环 0 中运行,仅此而已。这与用户级权限无关:以 root 身份运行的进程仍然主要是用户级代码,因此它们大多数时间都在环 3 中运行。用户进程在环 0 中运行的唯一时间是当它调用系统调用时,并且您无法使用将gdb活动环视为环 0 来中断该调用。

在具有半虚拟化 VM 的 Xen 上,情况略有不同;虚拟机管理程序在环 0 中运行,用户空间在环 3 中运行,内核在环 1(在 32 位 x86 上)或环 3(在 64 位 x86 上)中运行。

相关内容