2013-12-09 16 views
10

カーネル空間のメモリマッピングを調べるにはどうすればよいですか? VA - > PAカーネル仮想メモリを物理メモリにマップする方法

は、私は私たちにユーザ空間のアプリケーションのマッピングを与えるprocファイルシステム/proc/pid/maps & /proc/pid/mappingsの意識です。カーネルスペースのマッピングを見つけるのに似たものは何ですか?

ありがとうございます!

+0

少し前ですが、まだ関連しています:http://www.tldp.org/LDP/tlk/mm/memory.html。 –

+0

実際の問題は何ですか? –

+0

http://books.msspace.net/mirrorbooks/linuxsystems/images/059600222X/figs/bels_0206.gif – MDMoore313

答えて

11

ここには部分的な回答があります。多分役立つかもしれません。

Linuxは、カーネルの仮想アドレス空間をlowmemとvmallocの2つの部分に分割します。

Lowmemは、仮想アドレスと物理アドレスの間に1-1マッピングを使用します。私。仮想アドレスXは物理アドレスX-C(Cはある一定の値、例えば3GB)にマッピングされる。このマッピングはブート中に構築され、決して変更されません。

Vmallocはオンデマンドで動的マッピングを使用します。各割り当てでは、物理ページの束と仮想アドレス範囲が見つけられ、ページングテーブルが変更されてマッピングが作成されます。

2つは2つの仮想アドレスで区切られています。異なる仮想アドレス範囲がそれぞれ使用されます。 lowmem範囲は常にマップされ、vmalloc範囲は割り当て時にマップされます。

+0

あなたの説明をありがとう。どのようにしてLowmemの範囲を見つけることができますか?私はあなたが話している定数を見つけることができました.PAGE_OFFSETは0xC0000000です。 – kimi

2

実際、カーネル空間は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

関連する問題