896MB以上のRAMを備えた32ビットシステムでは、カーネル仮想アドレスと非連続マッピングのためにカーネルアドレスマッピングを変更する必要があるのは当然です。
しかし、64ビットではどのように処理されますか? RAMは常にアドレス空間に完全にマッピング可能であるため、デフォルトのカーネルページテーブルは初期化時に一度設定され、マッピングは変更されないため、変更しないでください。その場合、ユーザーページテーブルのこのカーネル領域は更新する必要はありません。
しかし、32ビットでユーザープロセスページテーブルがどのように更新されるのかをよく説明する人はいますか?よく言及されるように、メインカーネルページテーブルは直接使用されず、参照用にのみ使用されます。ユーザーページテーブルのカーネル領域エントリは各プロセスにコピーされますか?
ベストアンサー1
896MB以上のRAMを備えた32ビットシステムでは、カーネル仮想アドレスと非連続マッピングのためにカーネルアドレスマッピングを変更する必要があることは明らかです。
うん、これといい高メモリ。
しかし、64ビットではどのように処理されますか? RAMは常にアドレス空間に完全にマッピング可能であるため、デフォルトのカーネルページテーブルは初期化時に一度設定され、マッピングは変更されないため、変更しないでください。その場合、ユーザーページテーブルのこのカーネル領域は更新する必要はありません。
はい。
しかし、32ビットでユーザープロセスページテーブルがどのように更新されるのかをよく説明する人はいますか?よく言及されるように、メインカーネルページテーブルは直接使用されず、参照用にのみ使用されます。ユーザーページテーブルのカーネル領域エントリは各プロセスにコピーされますか?
上にリンクされた highmem ドキュメントでは、highmem マッピングには「カーネルのページテーブル」だけを操作すれば良いことが示されています。
「ページテーブル」は実際にはツリー構造です。例えば「ステップ4ページテーブル」[LWN.net, 2004]。トップレベルはシングルページ(4096バイト)です。カーネルスコープをマッピングするエントリは、すべてのプロセスで同じ値に設定されるため共有されます。一時マッピングはツリーの下位レベルで発生するため、各プロセスページテーブルを個別に変更するのではなく、共有カーネルページテーブル内でのみ変更する必要があります。
少なくともそれは私の一般的な概要です。私はすべての言葉を持っていません。