
Linux 确实会启用全部的 512MB 物理内存。 free -m 显示的 368MB 只是当前完全空闲、可以随时分配给应用程序使用的内存,并不是系统的全部内存。
剩下的内存去哪了?
这 144MB 的差额(512MB - 368MB)被 Linux 内核用于几个关键的用途:
-
内核自身占用 :Linux 内核的代码、数据结构、页表等需要永久占用 一块内存,这部分永远不会被释放给应用程序。从你之前的
dmesg输出可以看到,内核映像本身就有7168K(7MB),还有rwdata、rodata、bss等,合计大约十几兆字节。 -
硬件保留与 DMA 操作 :系统启动时,内存管理单元会从物理内存中划分出一部分,专门用于与硬件外设(如网卡、USB 控制器、你 FPGA 里的运动控制逻辑)进行高速数据交换。这种内存区域被称为 DMA 预留区。你之前的日志里就有一行
Reserved memory: created DMA memory pool at 0x18000000, size 128 MiB,这说明系统在物理地址0x18000000(大约是 384MB 的位置)为 DMA 操作预留了 128MB 的空间。这部分内存对普通应用程序是不可见的。 -
CMA (连续内存分配器) 预留 :CMA 是内核为需要物理连续 大块内存的设备(如摄像头、GPU)预留的"弹性"区域。你日志中的
cma-reserved表明有 16MB 内存是为此保留的,当没有设备使用它时,应用程序也可以从中分配内存。
mem=256和mem=512M时:内存容量的增加,不仅仅带来了更多的空闲内存,也导致了"系统开销"的增加。
| 状态 | 物理内存 (iomem) |
系统总内存 (free -m 的 total) |
空闲内存 (free -m 的 free) |
系统占用 |
|---|---|---|---|---|
| 之前 (256M) | 256 MB | 242 MB | 232 MB | 约 14 MB |
| 现在 (512M) | 512 MB | 368 MB | 357 MB | 约 11 MB |
-
total值不是 512MB :free -m显示的 368MB 就是一个明确的提示:这 512MB 物理内存,并没有全部被内核纳入"可供分配"的池子。 -
新增的容量去哪了? 新的可用
total(368MB) 比之前的 (242MB) 多了 126MB,而不是 256MB。 -
系统"开销"变大了:在 256M 模式下,系统的"基础开销"大约是 14MB;在 512M 模式下,这个开销变成了约 144MB (512MB - 368MB)。
这多出来的开销用在哪了?
这部分"消失"的内存,并没有真的消失,而是被内核用于管理这块更大的内存区域。最主要的用途是:
-
内核的固定开销增加了 :管理更大的内存,内核需要维护更多的元数据。例如,用于虚拟内存管理的页表 和用于内存块分配的mem_map 数组都需要占用更多的物理内存来存储。内存越大,这部分开销就越大。
-
硬件预留区 (DMA/CMA) 按比例增加 :在 512M 模式下,内核日志明确告诉你它创建了一个 128 MiB 的 DMA 内存池。这是导致"开销"剧增的最直接、最主要的原因。这部分内存在设计上就会被永久占用,不会对普通应用程序开放。
这个现象也符合 Linux 内存管理的普遍规律:内存越大,系统自身的"固定开销"也越大
硬件预留区的大小是根据整个系统的"地址空间"来决定的,而不仅仅是物理内存的大小。当您把物理内存从256MB扩展到512MB时,DDR控制器的地址空间变大了,为了保证所有地址范围都能被稳定、快速地访问,硬件预留区(尤其是为DMA操作预留的区域)也必须相应扩大
"硬件预留区"到底留给了谁?
您看到的 Reserved memory: created DMA memory pool at 0x18000000, size 128 MiB,主要是为DMA预留的。
-
DMA是什么? 简单说,它是一种"硬件搬运工",能让网卡、SD卡、USB控制器、FPGA逻辑等外设,不经过CPU,直接在它们自己和内存之间搬运数据。这对于高速数据传输(比如实时采集、网络通信)至关重要。
-
为什么要给DMA预留专用区域? 因为这些外设"搬运工"通常很笨 ,它们只认物理地址,并且要求这块内存是物理上连续的。这就像一个大货车,需要一块连续、没有障碍物的场地才能倒车入库。如果不提前规划好,零散的内存地址会让这些"搬运工"无法工作。
df -h命令:

可以把整个 DDR 内存想象成一个 500 平方米的大仓库,Linux 内核是仓库管理员。
而 df -h 里的 175MB 和 184MB,只是管理员在空闲面积 (368MB) 中,用绳子圈出了几块临时区域 ,并贴了标签说明"这块地方最多可以临时占用184MB"。它不是已经占用了 ,而是一个动态的、最大可用的额度。
df -h 里的 Size 只是一个上限,Used 才是它真正占用的内存,而这部分占用内存会直接体现在 free -m 的减少上。
-
free -m的 368MB :这是仓库里真正空着,可以随时堆放新货物的实际空地面积。 -
你计算的 144MB (512-368) :这是已经被管理员和他划定的"消防通道"(DMA区域) 永久占用的实际使用面积。这144平方米里,已经实实在在地画了线、放了东西。
-
df -h的 175MB / 184MB :这是管理员在墙上贴了几个告示牌,上面写着:"杂物间临时存放区,最大限额 184 立方米 "。这只是一个容量上限 ,不代表里面已经堆了 184 立方米的货物。实际上,从你的输出来看(Used列几乎是 0),这些区域目前几乎是空的。 -
让我们回到你的数据:
-
总仓库面积: 512 平方米 (物理内存)
-
实际已使用面积 (144MB):管理员办公区 + 消防通道 (内核 + DMA)
-
实际空闲面积 (368MB) :
free -m显示的available