私は仮想マシンとそれらが実行されているリングに取り組んでいます。文書内でこれを見つけるのが難しい場合があります。そのため、仮想マシンを実行してからプロセスを見て、どのリングで実行されているかを確認したいと思います。
ブログ投稿によるとグスタボ・ドゥアルテCPL レジスタは、プロセスのリングに応じてプロセッサによって設定されます。存在するここ@Stephen Kittは可能性があると述べた。 gdbを使用するソリューションは、前述のようにレジスタ値Ring3を返します。私は似てModemManager
いるか、Ring0で実行されているプロセスだと思ったことを試しましたが、iwlwifi
すべてRing3をcsレジスタの内容として返します。
推奨される方法はを使用することですftrace
。ただし、この手順は非常に複雑でチュートリアルを見つけることができません。プロセスのCSを得る魔法のような方法を知っている人はいますか?
CSレジスタから値を取得する他の方法はありますか?
ベストアンサー1
x86では、CSレジスタはアクティブリングを完全に決定するため、プロセスが実行されているリングを決定する他の方法は実際には必要ありません。仮想マシンを実行しているため、所有しているハイパーバイザーに応じて、内部のデバッグ機能を使用して、外部から仮想マシン内の仮想CSの現在の値を表示できます。
実行中のシステムでCS値を取得する際の最大の問題は、CS値が次のようになることです。完全値の取得に使用されるプローブの特性によって決まります。ユーザ空間プローブを使用している場合、カーネルレベルプローブを使用すると、常にユーザ空間に対応する値が表示されます。調査または道)、常にカーネル空間に対応する値を見ることができます。
とにかくLinux on bare metalでは、状況は非常に簡単です。ユーザーコードはリング3で実行され、カーネルはリング0で実行され、それがすべてです。これは、ユーザーレベルの権限とは何の関係もありません。ルートとして実行されるプロセスは依然として主にユーザーレベルのコードであるため、ほとんどがリング3で実行されます。ユーザープロセスがリング0で実行される唯一の時間はシステムコールを呼び出すときであり、アクティブgdb
リングをリング0として処理してその呼び出しを中断することはできません。
準仮想化VMを持つXenでは、状況が若干異なります。ハイパーバイザーはリング0で実行され、ユーザースペースはリング3で実行され、カーネルはリング1(32ビットx86で)またはリング3(x86で実行される64ビットで実行されます))。