Windows 32 ビットでは、カーネルは合計 4G のユーザー仮想メモリ空間から 1G の仮想メモリを予約し、カーネル空間の一部をこの 1G 空間にマップするようです。
だから私の質問は:
- 32 ビット Linux で同様の状況はありますか?
- もしそうなら、どうすればメモリレイアウト全体を見ることができますか?
おもう
cat /proc/pid/map
特定のプロセスのユーザー空間レイアウトしか見ることができません..
ありがとうございました!
Windows 32 ビットでは、カーネルは合計 4G のユーザー仮想メモリ空間から 1G の仮想メモリを予約し、カーネル空間の一部をこの 1G 空間にマップするようです。
だから私の質問は:
おもう
cat /proc/pid/map
特定のプロセスのユーザー空間レイアウトしか見ることができません..
ありがとうございました!
32 ビット Linux で同様の状況はありますか?
はい。32 ビット Linux では、デフォルトで、カーネルはアドレス空間の上位 4 分の 1 (C0000000 からメモリの最上部までの 1G) を独自に使用するために予約します。
もしそうなら、どうすればメモリレイアウト全体を見ることができますか?
できません。ユーザー空間/proc/pid/maps
に存在するマッピングのみを表示します。カーネル メモリはユーザー空間アプリケーションからアクセスできないため、表示されていません。
この配置が使用される理由に注意してください。カーネルがアクティブな間、ユーザー空間マッピングをアクティブに保ちながら、独自のマッピングをインストールできる必要があります (たとえば、ユーザー空間から、またはユーザー空間にデータをコピーできるようにするため)。これは、その高いメモリ範囲をそれ自体のために予約することによって実現されます。
カーネル内のメモリ マッピングの場所は、カーネル自体以外には関係がないため、偶然または一部のデバッグ メッセージを除いて、ユーザー空間にはまったく公開されません。
実際、32 ビット Windows では、/3G
ブート オプションがない場合、カーネルはリニア アドレス空間の上部 2GB にマップされ、ユーザー プロセス用に 2GB が残されます。
Linux も同様のことを行いますが、カーネルを線形空間の上位 1GB にマップするため、ユーザー プロセス用に 3GB が残されます。
/proc ファイルシステムを使用するだけでメモリ レイアウト全体を確認できるかどうかはわかりません。学生向けに設計したラボ用に、ユーザーが物理メモリ アドレスを覗いて、CR3 (ディレクトリ ページ ベース アドレス) などのいくつかの制御レジスタの内容を取得できる小さなデバイス ドライバを作成しました。
これらの 2 つの操作を使用することで、現在のプロセス (この操作を実行しているプロセス) のディレクトリ ページをウォークスルーし、どのページが存在するか、どのページがユーザーとカーネルによって所有されているか、または単にカーネルによって所有されているかを確認できます。その情報を使用して、カーネル空間を含むメモリ使用量を示すマップを表示する必要があります。
こちらのPDFをご覧ください。これは、コースで行ったすべてのラボのコンパイル済みバージョンです。 http://www.atc.us.es/asignaturas/tpbn/PracticasTPBN2011.pdf
PDF の 36 ページ (ドキュメントの 30 ページ) に、メモリ マップがどのように見えるかが示されています。これは、ラボ #3 の演習 #3.2 を実行した結果です。
文章はスペイン語ですが、わからないところがあれば翻訳機などを使ってもいいと思います。この演習では、受講者がページング システムのしくみと、ディレクトリとページ エントリのレイアウトの解釈方法について、以前に読んだことがあると想定しています。
マップはこんな感じ。16x64 ブロック。ブロック内の各セルは、現在のプロセスの仮想アドレス空間の 4MB を表します。1024 のエントリ (ページ) を持つページ テーブルによって記述される 4 MB の領域があり、すべてのページが存在するわけではないため、マップは 3 次元である必要がありますが、マップを明確に保つために、演習ではユーザーがこれらの領域を折りたたむ必要があります。現在のページを説明する最初のページ エントリの内容を表示し、そのページ テーブル内の後続のすべてのページが同じ属性を共有することを期待しています (これは実際には true である場合とそうでない場合があります)。
このマップは、カーネル 2.6.X で使用されます。はPAE
使用されず、使用されますPSE
(制御レジスタからの 2 ビット フィールド)。2MB ページを有効にし、4MB ページを有効にします。4KB ページは常に利用可能です。PAE
PSE
CR4
PAE
PSE
. : PDE not present, or page table empty.
X : 4MB page, supervisor.
R : 4MB page, user, read only.
* : 4MB page, user, read/write.
x : Page table with at least one entry describing a supervisor page.
r : Page table with at least one entry describing an user page, read only.
+ : Page table with at least one entry describing an user page, read/write.
................................r...............................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
...............................+..............................+.
xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXxX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..x...........................xx
3GB の広大なメモリ空間があり、この場合はほとんど空です (プロセスは小さな C アプリケーションであり、4MB 未満しか使用せず、すべてがページ テーブルに含まれており、その最初の現在のページは読み取り専用ページです)。 、プログラムコードの一部であると想定されるか、静的文字列である可能性があります)。
3GB 境界の近くに、読み取り/書き込み可能な 2 つの小さな領域があり、ユーザー プログラムによってロードされた共有ライブラリに属している可能性があります。
最後の 4 行 (256 のディレクトリ エントリ) は、ほとんどすべてがカーネルに属しています。実際に存在し、使用されている 224 のエントリがあります。これらは、物理メモリの最初の 896MB をマップします。これは、カーネルが存在するスペースです。カーネルは最後の 32 エントリを使用して、896MB を超える RAM を搭載したシステムで 896MB マークを超える物理メモリにアクセスします。