512Mメモリはどこから来たのですか?

512Mメモリはどこから来たのですか?

仮想マシンKaliはこのように4Gメモリを割り当てました。メモリ状態

しかし、問題があります。メモリをハッキングするために、ゲストに自己構築カーネルをインストールしました。

# uname -a
Linux 15ud490-gx76k 6.8.4+ #8 SMP PREEMPT_DYNAMIC Sat Apt 6 15:49:20 KST 2024 x86_64 x86_64 x86_64 GNU/Linux

以下のようにメモリが終わる領域を見たいです。 記憶を見て

メモリサイズは16 * 0x336000バイトです。その後、結果に基づいてホストのメモリサイズを推定した。

$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 16*0x07fff0
8388352
>>> 16*0x07fff0/1024/1024
7.999755859375
>>> 16*0x335ff0/1024/1024
51.374755859375
>>> 16*0x336000/1024/1024
51.375
>>> 521000/1024/1024
0.49686431884765625
>>> (1024*1024*4+521000+3288)*1024/1024/1024/1024 # Convert into gigabytes
4.5

ゲストに4Gのメモリを与えたのですが、上記の状況によると4.5GiBになりますね。スワップは1Gなのでこれはゴミです。

0.5Gメモリはどこから出ますか? ? ? ?

答え1

RAM用に構築された物理メモリ空間は必ずしも連続的である必要はなく、RAMだけが物理アドレスを取得する唯一のものではありません。コンピュータには、メモリマップされたバス/デバイスがあります。

cat /proc/iomemデバイスと物理メモリ空間のマッピングを見てください。lsmem実際のアドレス空間マッピングが大幅に簡素化されました!

これは決してLinuxに限定されていません。ほとんどすべての現代のコンピュータアーキテクチャはこのように動作します。

今、あなたの特定のケースであなたが見ている追加の「実際のRAM」は実際にはありませんが、ハイパーバイザーとVMの間の通信に使用されるキャプチャされたアドレスのようです。

答え2

出力には、lsmem4つのメモリブロック、つまりブロック28-31が「欠けている」とマークされています。メモリブロックサイズは128M、合計サイズは512Mです。この4つのブロックは「追加」メモリを占めます。lsmemこれは利用可能なメモリとして報告されません。それでは、これらのメモリは何であり、どこから来るのですか?

メモリの空白に対応するアドレスはIOメモリです。 ~によると古いがまだ関連性のあるHOWTO

iomemを使用してカードを挿入すると、実際にはメインメモリ用のメモリモジュールも挿入されます。 [...]共有メモリは、IOアドレス空間がデバイスとCPU間で共有されるように、デバイスとCPU(デバイスドライバの実行)間で共有されます。この共有メモリは、デバイスとメインメモリ間のデータ「転送」手段として機能します。

出力を調べる# cat /proc/iomemと、どのデバイスの物理メモリがベースアドレス空間にマップされているかを確認できます。

関連情報