我正在基于 ARM 的系统上运行自定义 Linux 发行版(它有两个 A7)。
Linux内核版本是4.86.9。
在调查运行内存密集型任务(如 tar 或 gzip)时集成显示器上出现的一些奇怪的图形故障的过程中,我试图dmesg
弄清楚 Linux 如何看待系统内存(应该是 1 GB DDR3L 中的 620 MB) ,根据 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)
似乎有些不对劲:
- 可用内存仅为 484 MB/634 MB。 484 MB 和 634 MB 对我来说都没有意义。
vmalloc
高达 648 MB。
你能帮我理解这些价值观吗?
我指出高内存根据 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
是 392 MB,只有 648 MB 的一半!
提前致谢,如果我遗漏了一些重要内容,请原谅我。
答案1
这正是虚拟内存的本质:将物理内存(和其他东西)映射到完全独立的内存空间。
这并不是特定于您的嵌入式设备或 Linux;而是特定于您的嵌入式设备或 Linux。这就是虚拟内存。
该内存空间可以大于或小于物理内存,没有问题:没有什么说明每个进程的虚拟内存空间中的每个地址都需要映射到某个东西。