Linuxでプロセスがどのリングで実行されているかどうかを確認するには?

Linuxでプロセスがどのリングで実行されているかどうかを確認するには?

特定のプロセスがどの保護リングで実行されているかどうかを確認できますか?可能であれば、実行中のプロセスのリストとそのリングを作成できますか?このスレッドは、x86プロセッサで使用されるリングについての洞察を提供します。https://stackoverflow.com/questions/18717016/what-are-ring-0-and-ring-3-in-the-context-of-operating-systems

リングプロセスの説明を提供せずに、私が実行している保護リングレベルプロセスを見つける方法を知りたいです。〜する実行中です(必要に応じて含めることもできます)。

答え1

存在するx86、現在の権限レベル下の2桁の数字で決定スニペットセレクター、つまりCSレジスタに保存されている値です。したがって、プロセスの現在の権限レベルを決定するために実行する必要がある「すべての」操作は、対応する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 ...CSの現在値を確認し、値の最下位2ビットを抽出します。gdbinfo registers cs

Linuxでx86現在の権限レベルは常に3であることがすぐにわかります。ユーザープロセスは、システムコール(リング0で実行)にない限り、常にリング3で実行されますが、リング0以外では表示されません。ftraceたとえば、カーネルコードの追跡

関連情報