Cut*_*Eye 1 cpu process privileges
我正在研究虚拟机及其运行的环。从文档中,有时很难找到。所以我想运行虚拟机,然后查看进程并查看它们在哪个环中运行。
根据Gustavo Duarte的博客文章,CPL 寄存器由处理器根据进程环设置。在这里@Stephen Kitt 提到有可能。使用 gdb 的解决方案返回作为寄存器值 Ring3。我已经尝试过类似ModemManager
或iwlwifi
我认为在 Ring0 中运行的进程,但它们都返回 Ring3 作为其 cs 注册内容。
建议的方法是使用ftrace
. 但是这个程序非常复杂,我找不到教程。有人知道获得流程的 CS 的魔法线吗?
有没有其他方法可以从 CS 寄存器中检索值?
在 x86 上,实际上不需要另一种方法来确定进程在哪个环中运行,因为 CS 寄存器完全确定了活动环。由于您正在运行虚拟机,因此根据您拥有的虚拟机管理程序,可能可以使用调试功能从外部查看虚拟机内部虚拟 CS 的当前值。
在正在运行的系统中检索 CS 的值的一个大问题是 CS 的值将完全由您用于检索该值的探针的性质决定。如果您使用用户空间探测器,您将始终看到与用户空间对应的值;如果您使用内核级探测器(kprobe或ftrace),您将始终看到与内核空间对应的值。
无论如何,在裸机上的 Linux 上,情况非常简单:用户代码在环 3 中运行,内核在环 0 中运行,仅此而已。这与用户级权限无关:以 root 身份运行的进程仍然主要是用户级代码,因此它们大部分时间将在环 3 中运行。用户进程在环 0 中运行的唯一时间是当它调用系统调用时,并且您不能中断使用gdb
将活动环视为环 0。
在具有半虚拟化 VM 的 Xen 上,情况略有不同。管理程序在环 0 中运行,用户空间在环 3 中运行,内核在环 1(在 32 位 x86 上)或环 3(在 64 位 x86 上)中运行。