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
(参照)ここ)。
vsyscall
QEMUゲスト(具体的に)のCPL3コードからメモリにアクセスしようとし*(int *)0xffffffffff600000
ましたが、cpu_entry_area
(具体的に)アクセスしようとすると*(int *)0xfffffe0000000ee0
segfaultが発生します。
答え1
cpu_entry_area
CPUが制御権をカーネルに転送するために必要なすべてのデータとコードが含まれています。 KPTIが有効になると、ユーザースペースの実行時にカーネルの対応する部分のみがマップされます。その定義を見ることができます。arch/x86/include/asm/cpu_entry_area.h
:含まれています
- グローバルデータテーブル
- エントリスタック
- 交通セキュリティサービス
- トランポリンセット;
- 例外スタック
- デバッグストアとバッファ。
トランポリンにはシステムコールのエントリポイントが含まれています。arch/x86/entry/entry_64.S
64ビット呼び出しのエントリポイントを定義します。
これらのいずれもリング3から直接アクセスすることはできませんが、リング3コードは権限レベルの変更を可能にするCPU調停メカニズムを使用してそのエントリにジャンプできます(例えばCPUSYSCALL
命令)。
カーネル文書からページテーブルの分離より多くの背景情報を提供してください。