CPU_entry_areaとは何ですか?

CPU_entry_areaとは何ですか?

Linux カーネルのドキュメントでは、以下を説明します。仮想メモリマッピング

それは言う:

fffffe0000000000 - fffffe7fffffffff (=39 bits) cpu_entry_area mapping

この「CPUエントリーエリア」とは何ですか?実行中のコードにアクセスする方法はありますか?リング3(例:CPL3)?

QEMUを試していますが、QEMUゲスト(Ubuntu Server 18.04)で実行されているいくつかのCPL3コードがありますcpu_entry_area。 CPL3上記の
すべての住所にアクセスできないと思ったので、何か間違ったことをしていましたが、0x00007fffffffffff後で知りましたvsyscall(参照)ここ)。

vsyscallQEMUゲスト(具体的に)のCPL3コードからメモリにアクセスしようとし*(int *)0xffffffffff600000ましたが、cpu_entry_area(具体的に)アクセスしようとすると*(int *)0xfffffe0000000ee0segfaultが発生します。

答え1

cpu_entry_areaCPUが制御権をカーネルに転送するために必要なすべてのデータとコードが含まれています。 KPTIが有効になると、ユーザースペースの実行時にカーネルの対応する部分のみがマップされます。その定義を見ることができます。arch/x86/include/asm/cpu_entry_area.h:含まれています

  • グローバルデータテーブル
  • エントリスタック
  • 交通セキュリティサービス
  • トランポリンセット;
  • 例外スタック
  • デバッグストアとバッファ。

トランポリンにはシステムコールのエントリポイントが含まれています。arch/x86/entry/entry_64.S64ビット呼び出しのエントリポイントを定義します。

これらのいずれもリング3から直接アクセスすることはできませんが、リング3コードは権限レベルの変更を可能にするCPU調停メカニズムを使用してそのエントリにジャンプできます(例えばCPUSYSCALL命令)。

カーネル文書からページテーブルの分離より多くの背景情報を提供してください。

関連情報