組み込みLinux - 仮想カーネルメモリが物理メモリよりも大きいのはなぜですか?

組み込みLinux - 仮想カーネルメモリが物理メモリよりも大きいのはなぜですか?

私はARMベースのシステム(2つのA7があります)でカスタムLinuxディストリビューションを実行しています。

Linuxカーネルのバージョンは4.86.9です。

tarやgzipのようなメモリ集約的なタスクを実行するときに統合モニタで発生する奇妙なグラフィック欠陥を調査する過程で、dmesgLinuxがシステムメモリ(1GB DDR3Lのうち620MBでなければならない)をどのように見ているかを調べようとしています。 Yocto メモリレイアウト構成).

dmesg表示される内容は次のとおりです。

Memory: 484008K/634880K available (5120K kernel code, 205K rwdata, 1476K rodata, 1024K init, 331K bss, 15704K reserved, 135168K cma-reserved, 0K highmem)
Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc : 0xd7000000 - 0xff800000   ( 648 MB)
        lowmem  : 0xb0000000 - 0xd6c00000   ( 620 MB)
        pkmap   : 0xafe00000 - 0xb0000000   (   2 MB)
        modules : 0xaf000000 - 0xafe00000   (  14 MB)
          .text : 0xb0008000 - 0xb0600000   (6112 kB)
          .init : 0xb0800000 - 0xb0900000   (1024 kB)
          .data : 0xb0900000 - 0xb0933468   ( 206 kB)
          .bss  : 0xb0935000 - 0xb0987e8c   ( 332 kB)

何か間違っているようです:

  1. 利用可能なメモリはわずか484MB/634MBです。 484MBも634MBも私には意味がありません。
  2. vmalloc最大648MB。

これらの価値を理解するのに役立ちますか?

私は指摘した高メモリYoctoの設定に応じて無効になります。

無効にする前は、上記のように使用量はまだ0Kでしたが、表示されるレイアウトはdmesg少し異なりました。

Memory: 484720K/634880K available (5120K kernel code, 197K rwdata, 1428K rodata, 1024K init, 256K bss, 14992K reserved, 135168K cma-reserved, 0K highmem)
Virtual kernel memory layout:
        vector   : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap   : 0xffc00000 - 0xfff00000   (3072 kB)
        vmalloc  : 0xe7000000 - 0xff800000   ( 392 MB)
        lowmem   : 0xc0000000 - 0xe6c00000   ( 620 MB)
        pkmap    : 0xbfe00000 - 0xc0000000   (   2 MB)
        modules  : 0xbf000000 - 0xbfe00000   (  14 MB)
           .text : 0xc0008000 - 0xc0600000   (6112 kB)
           .init : 0xc0800000 - 0xc0900000   (1024 kB)
           .data : 0xc0900000 - 0xc09314d8   ( 198 kB)
           .bss  : 0xc0933000 - 0xc09732d8   ( 257 kB)

ご覧のとおりvmalloc、392MBで648MBの半分にすぎません!

事前に感謝し、重要な内容を逃した場合はご了承ください。

答え1

これがまさに仮想メモリです。つまり、物理メモリ(およびその他の項目)を完全に別々のメモリ空間にマッピングすることです。

これは組み込みデバイスやLinuxに限定されません。これが仮想メモリです。

対応するメモリ空間は、物理メモリよりも大きくても小さくてもよい。問題ありません。各プロセスの仮想メモリ空​​間内のすべてのアドレスを何かにマッピングする必要はありません。

関連情報