web-dev-qa-db-ja.com

dmesgの仮想カーネルメモリレイアウトは何を意味しますか?

"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)

値から、2 GBのRAM(物理メモリ)があることがわかります。しかし、残りの部分は私にとってマジックナンバーのようです。

それぞれについて(フィックスマップ、pkmapなど)簡単に知りたい(さらに疑問がある場合は、それぞれを個別の質問として投稿します)?

誰かがそれを私に説明できますか?

19
Sen

まず、32ビットシステムには0xffffffff4'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ではありません。カーネルが不連続なメモリ割り当てとフィックスマップされた線形アドレスを実装するには、常に少なくとも128 MBの線形アドレスが必要になるためです。

vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)

仮想メモリの割り当てでは、不連続なスキームに基づいてページフレームを割り当てることができます。このスキーマの主な利点は、外部の断片化を回避することです。これは、スワップ領域、カーネルモジュール、または一部のI/Oデバイスへのバッファーの割り当てに使用されます。

pkmap   : 0xff800000 - 0xffa00000   (2048 kB)

永続的なカーネルマッピングにより、カーネルはハイメモリページフレームのカーネルアドレススペースへの長期的なマッピングを確立できます。 HIGHMEMページがkmap()を使用してマップされると、仮想アドレスがここから割り当てられます。

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)

これらは、ローマップアドレスのような最後の1 GBだけでなく、RAM内の任意の物理アドレスを参照できるフィックスマップリニアアドレスです。修正マップされた線形アドレスは、lowmemおよびpkmapの同僚よりも少し効率的です。固定マッピングに割り当てられた専用のページテーブル記述子があり、kmap_atomicを使用したHIGHMEMページのマッピングはここから割り当てられます。


ウサギの穴をもっと詳しく知りたい場合:
Linuxカーネルについて

22
wag