経験する「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)
この値を見ると、RAM(物理メモリ)が2 GBであることがわかります。しかし、残りのものは私に魔法の数字のように見えます。
各問題(fixmap、pkmapなど)の簡単な概要を知りたいです。さらに質問がある場合は、各問題を個別の質問として投稿します。
誰かが私にこれを説明できますか?
答え1
まず、32ビットシステムには、RAMの物理位置にアクセスするための0xffffffff
(4'294'967'295
)線形アドレスがあります。
カーネルはこれらのアドレスをユーザー空間とカーネル空間に分けます。
ユーザースペース(より高いメモリ)はユーザーがアクセスでき、必要に応じてカーネルがアクセスできます。
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)
カーネルの初期ページテーブルが配置される範囲。
(一部の動的データ構造には別の128kBが使用されます。)
この最小アドレス空間は、RAMにカーネルをインストールし、コアデータ構造を初期化するのに十分である。
それらが使用するサイズは、カーネルコードを例として括弧内に表示されます。
0xc071ae6a - 0xc0400000 = 31AE6A
10進表記法は3'255'914
(3179kB)です。
2. 初期化後のカーネル空間の使用
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
lowmem スコープは、カーネルから物理アドレスに直接アクセスするために使用できます。
カーネルは、非連続メモリ割り当ておよび固定マッピング線形アドレスには常に少なくとも128MBの線形アドレスを必要とするため、これは合計1GBではありません。
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カーネルについて学ぶ