「dmesgの出力」を実行している間 正しく理解できない値のリストが表示されました。
Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
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)
値から、私は2GBのRAM(物理メモリ)を持っていることがわかります。しかし、残りは私にとってマジックナンバーのようです。
それぞれ(fixmap、pkmapなど)について簡単に知りたいのですが(疑問がある場合は、それぞれを個別の質問として投稿します)?
誰かが私にそれを説明してもらえますか?
承認された回答:
まず、32ビットシステムには0xffffffff
があります (4'294'967'295
)RAM上の物理的な場所にアクセスするための線形アドレス。
カーネルはこれらのアドレスをユーザー空間とカーネル空間に分割します。
ユーザースペース(ハイメモリ)には、ユーザーがアクセスでき、必要に応じてカーネルもアクセスできます。
16進数と10進数のアドレス範囲:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
カーネルスペース(メモリ不足)には、カーネルからのみアクセスできます。
16進および10進表記のアドレス範囲:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
このように:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
したがって、dmesg
で見たメモリレイアウト カーネル空間での線形アドレスのマッピングに対応します。
まず、カーネル自体のページテーブルの初期化を提供する.text、.data、および.initシーケンス(線形を物理アドレスに変換します)。
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
カーネルコードが存在する範囲。
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
カーネルデータセグメントが存在する範囲。
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
カーネルの初期ページテーブルが存在する範囲。
(および一部の動的データ構造の場合はさらに128 kB。)
この最小限のアドレス空間は、カーネルをRAMにインストールし、そのコアデータ構造を初期化するのに十分な大きさです。
それらの使用サイズは括弧内に示されています。たとえば、カーネルコードを見てください。
0xc071ae6a - 0xc0400000 = 31AE6A
10進表記では、3'255'914
(3179 kB)。
次に、初期化後のカーネルスペースの使用
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
カーネルはlowmem範囲を使用して、物理アドレスに直接アクセスできます。
これは、完全な1 GBではありません。これは、カーネルが非連続メモリ割り当てと修正マップ線形アドレスを実装するために、常に少なくとも128MBの線形アドレスを必要とするためです。 。
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
仮想メモリの割り当てでは、非連続スキームに基づいてページフレームを割り当てることができます。このスキーマの主な利点は、外部の断片化を回避することです。これは、スワップ領域、カーネルモジュール、または一部のI/Oデバイスへのバッファの割り当てに使用されます。
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
永続的なカーネルマッピングにより、カーネルは、カーネルアドレス空間へのハイメモリページフレームの長期的なマッピングを確立できます。 kmap()を使用してHIGHMEMページをマッピングする場合、仮想アドレスはここから割り当てられます。
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
これらは修正マップされた線形アドレスであり、lowmemアドレスのように最後の1 GBだけでなく、RAM内の任意の物理アドレスを参照できます。修正マップされた線形アドレスは、lowmemやpkmapの同僚よりも少し効率的です。
固定マッピングに割り当てられた専用のページテーブル記述子があり、kmap_atomicを使用したHIGHMEMページのマッピングはここから割り当てられます。
うさぎの穴を深く掘り下げたい場合:
Linuxカーネルについて