fs セグメント レジスタはどのように TEB と KPCR を指していますか。これらのデータ構造は、スレッドのユーザーおよびカーネル スタックに保存されますか? ユーザーからカーネルへのスレッド コンテキスト スイッチが発生した場合、TEB のポインタを含む fs セグメント reg がスレッドのユーザー スタックに保存され、KPCR を指すカーネル fs セグメント レジスタがロードされます。 fsセグメントレジスタ? これは、fs セグメント レジスタが TEB と KPCR の両方を指す方法ですか?
2 に答える
レジスタには、または(ローカル/グローバル セグメント記述子テーブル)のFS
いずれかに関連付けられたセグメント ベース アドレスがあります。記述子テーブルへのインデックスであり、テーブルで定義されたセグメントの 1 つを選択します。LDT
GDT
FS
FS
(命令でセグメント オーバーライド プレフィックスを使用して)メモリFS
にアクセスする場合、命令のアドレスにセグメント ベース アドレスを加えたものに等しい仮想アドレスでメモリにアクセスします。
そのセグメント ベース アドレスは、スレッド固有の制御データ構造の場所と一致する必要があります。そのため、特定の制御データ構造を使用してスレッドが作成されると、ベースはそのデータを指すように設定されます。
これらの場所は、同じプロセス内のスレッドごとに異なります。これは、すべてのスレッドがメモリを共有しており、互いの構造に踏み込むべきではないためです。コンテキスト スイッチはFS
、別のセグメントを指すように更新するか、記述子テーブル内のセグメントのベース アドレスを更新してからリロードFS
し、CPU によって変更が監視されるようにします。
スレッドがユーザー モードからカーネル モードに移行し、FS
それが指すものがカーネルの POV から信頼されていないFS
場合、カーネル側のスレッド固有のデータ構造を指す値でカーネルがリロードされることを期待しています。帰りに、ユーザーモードFS
を復元する必要があります。実際にはもう少し複雑かもしれませんが、これでアイデアが得られるはずです。
64 ビット モードSWAPGS
では、レジスタの内容をすばやく交換する命令もあり、32 ビット モードGS
と同様の役割を果たします。FS
したがって、fs セグメント レジスタは確実に kpcr を指しています。windbg を見て、「dt nt!_kpcr」を発行した後、kpcr の最初の構造は NtTib または TEB の最初の構造であるため、fs が KPCR と TEB を指すと言うと、fs は実際には KPCR と TIB/TEB を指します。 KPCR の最初のデータ構造。