カーネル空間のメモリマッピングを調べるにはどうすればよいですか? VA - > PAカーネル仮想メモリを物理メモリにマップする方法
は、私は私たちにユーザ空間のアプリケーションのマッピングを与えるproc
ファイルシステム/proc/pid/maps
& /proc/pid/mappings
の意識です。カーネルスペースのマッピングを見つけるのに似たものは何ですか?
ありがとうございます!
カーネル空間のメモリマッピングを調べるにはどうすればよいですか? VA - > PAカーネル仮想メモリを物理メモリにマップする方法
は、私は私たちにユーザ空間のアプリケーションのマッピングを与えるproc
ファイルシステム/proc/pid/maps
& /proc/pid/mappings
の意識です。カーネルスペースのマッピングを見つけるのに似たものは何ですか?
ありがとうございます!
ここには部分的な回答があります。多分役立つかもしれません。
Linuxは、カーネルの仮想アドレス空間をlowmemとvmallocの2つの部分に分割します。
Lowmemは、仮想アドレスと物理アドレスの間に1-1マッピングを使用します。私。仮想アドレスXは物理アドレスX-C(Cはある一定の値、例えば3GB)にマッピングされる。このマッピングはブート中に構築され、決して変更されません。
Vmallocはオンデマンドで動的マッピングを使用します。各割り当てでは、物理ページの束と仮想アドレス範囲が見つけられ、ページングテーブルが変更されてマッピングが作成されます。
2つは2つの仮想アドレスで区切られています。異なる仮想アドレス範囲がそれぞれ使用されます。 lowmem範囲は常にマップされ、vmalloc範囲は割り当て時にマップされます。
あなたの説明をありがとう。どのようにしてLowmemの範囲を見つけることができますか?私はあなたが話している定数を見つけることができました.PAGE_OFFSETは0xC0000000です。 – kimi
実際、カーネル空間はLOWとHIGHメモリに分かれています(vmalloc領域は高メモリの一部です)。 ugoren氏によると、lowmemはブート時に構築された直接マッピングです。たとえば、kmap(pkmap area)を使っていくつかのユーザー空間ページをマップするために、高いメモリを使用することができます。 ブート時にカーネルログにある詳細な画像を次に示します。 例:120高MEMに対して887低MEMに分け、この例の1Gbカーネル空間内
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
vmalloc : 0xf7ffe000 - 0xff7fe000 (120 MB)
lowmem : 0xc0000000 - 0xf77fe000 (887 MB)
.init : 0xc0906000 - 0xc0973000 (436 kB)
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
。あなたはvmalloc領域で占有されている120 MBの高メモリを見ることができ、pkmapとfixmap領域には2〜3 Kbsしか予約されていません。あなたがここで読むことができるfixmapsについてhttp://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html。
少し前ですが、まだ関連しています:http://www.tldp.org/LDP/tlk/mm/memory.html。 –
実際の問題は何ですか? –
http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313