我正在尝试了解 Linux 操作系统的基础知识。我在 64 位 CPU 上运行 64 位 Ubuntu 12.04。该系统有 2GB RAM。
cat /proc/meminfo
MemTotal: 2012040 kB
问题1: 缺失的 85112KB 内存在哪里?
2097152 (2 gb in kilobytes)
2012040 -
______________
85112
这是为其他目的保留的还是系统无法使用 4% RAM 的硬件限制?
问题2:我最初的阅读告诉我,用户内核空间有 3:1 的分割。为什么这里的情况不是这样呢?
(3/4)*2097152 =1572864 for user space
(1/4)*2097152 =524288 for kernel space
我知道 Linux RAM 缓存和缓冲区(至少我花了一些研究精力来理解这一点),但这种情况与此无关,所以这是怎么回事?
答案1
你确实不应该同时问两个问题,但是......
问题1
其中一些内存用于内核代码本身,一些被保留,等等。内核在系统引导消息中将其吐出:
[ 0.000000] Memory: 6106920k/7340032k available (3633k kernel code, 1057736k absent, 175376k reserved, 3104k data, 616k init)
“不存在”行是实际不存在的内存(该计算机当前安装了 6GiB RAM)。内核还会输出内存映射(这是引导消息中的较早部分):
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009ebff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009ec00-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e2c00-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000bf77ffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000bf780000-0x00000000bf797fff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x00000000bf798000-0x00000000bf7d9fff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x00000000bf7da000-0x00000000bfffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000ffe00000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x00000001bfffffff] usable
然后内核对该映射进行各种修复,通常会保留更多内存。尤其是当驱动程序加载时。
问题2
内核/用户划分为虚拟地址空间,不是内存。它与 64 位机器几乎无关,因为有太多的地址空间可供使用。
在 32 位机器上,虚拟地址 0x00000000–0xBFFFFFFF 用于用户地址空间。 0xC0000000–0xFFFFFFFF 被内核使用(这是 3:1 分割,其他选项包括 2:2 分割。注意这些数字是 GB,所以是 2:2 而不是 1:1)。虚拟地址也是特定于进程的(每个进程可以在 0x00001000 处有一个页面,并且它是一个不同的页面)。
但虚拟地址并不对应于内存的一个字节。它基本上可以得到四件事的支持:
- 没有什么。该页面未在使用中。尝试访问它,出现段错误。
- 物理内存。 MMU 将虚拟地址转换为某个物理地址,该地址实际上对应于某处 DIMM 上的电容器。
- 交换(或内存映射文件)。如果你访问它,就会出现页面错误,内核将在将数据读入内存时挂起你的进程(并可能将其他数据写入磁盘,以腾出空间)。然后内核更新页表,将其变成情况#2。
- 零页。这是新分配的页面,尚未使用。当它出现时,内核将找到一页物理内存(可能会交换其他内容),用零填充它(为了安全),然后就是情况#2。
透明大页使得更多情况。可能还有一些不太重要的我已经忘记了......
无论如何,我的 64 位芯片有 48 位虚拟地址大小。我不确定内核使用什么分割,但即使是一半,也是 47 位空间,远远超过 36 位物理地址大小。而且 131,072 GiB 的 RAM 太贵了……(而且,请记住,当它变得更便宜时,64 中还剩下很多位,未来的处理器可能只会允许更多的位)。
答案2
硬件预留将占用少量 RAM,特别是如果您的板载显卡需要使用一些 RAM 进行自身操作。所有操作系统都会发生这种情况。