但有一个问题。我在来宾上安装了自建内核来破解内存。
# 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
我给了 guest 内存 4G,但根据上面的情况,它有 4.5GiB。交换是1G所以这是废话。
0.5G内存的来源在哪里????
答案1
为 RAM 构建的物理内存空间不一定是连续的,RAM 也不是唯一获得物理地址的东西:您的计算机具有内存映射总线/设备。
尝试cat /proc/iomem
查看设备到物理内存空间的映射。lsmem
极大地简化了真正的地址空间映射!
这绝不是 Linux 所特有的:几乎所有现代计算机架构都是如此工作的。
现在,在您的具体情况下,我猜您看到的额外“真正的 RAM”实际上不是那个,而是用于虚拟机管理程序和虚拟机之间通信的捕获地址。
答案2
您的输出lsmem
显示 4 个内存块“丢失”,即块 28-31。您的内存块大小为 128M,总大小为 512M。这 4 个块占用了您的“额外”内存。lsmem
不将这些报告为可用内存,那么它们是什么以及它们来自哪里?
你内存中的间隙对应的地址就是IO内存。根据这个古老但仍然相关的 HOWTO,
当您插入使用 iomem 的卡时,您实际上也插入了主内存的内存模块。 [...] 共享内存在设备和 CPU(运行设备驱动程序)之间共享,就像 IO 地址空间在设备和 CPU 之间共享一样。该共享内存充当设备和主内存之间数据“传输”的手段。
检查 的输出# cat /proc/iomem
,您将看到哪些设备将其物理内存映射到主地址空间。