答案1
在 x86 上,实际上不需要其他方法来确定进程正在哪个环中运行,因为 CS 寄存器完全确定活动环。由于您正在运行虚拟机,根据您拥有的虚拟机管理程序,可以使用其中的调试功能从外部查看虚拟机内部虚拟 CS 的当前值。
在正在运行的系统中检索 CS 值的一个大问题是 CS 的值将是完全由用于检索值的探针的性质决定。如果您使用用户空间探针,您将始终看到与用户空间相对应的值;如果您使用内核级探针(探针或者追踪),您将始终看到与内核空间相对应的值。
无论如何,在裸机上的 Linux 上,情况非常简单:用户代码在环 3 中运行,内核在环 0 中运行,仅此而已。这与用户级权限无关:以 root 身份运行的进程仍然主要是用户级代码,因此它们大多数时间都在环 3 中运行。用户进程在环 0 中运行的唯一时间是当它调用系统调用时,并且您无法使用将gdb
活动环视为环 0 来中断该调用。
在具有半虚拟化 VM 的 Xen 上,情况略有不同;虚拟机管理程序在环 0 中运行,用户空间在环 3 中运行,内核在环 1(在 32 位 x86 上)或环 3(在 64 位 x86 上)中运行。