是,free -h 输出中 mem: 行的 total 列即为内核实际识别并可用的物理内存总量,已剔除显存、固件保留区等不可用区域,单位为 gib,略小于硬件标称值属正常现象。

free -h 显示的 total 是物理内存总量吗?
是,free -h 输出中 Mem: 行的 total 列就是系统识别到的物理内存总容量(不含 swap),但它可能略小于插槽标称值——比如你插了 16GB 内存条,free 却显示 15.6Gi,这是正常的。
原因包括:BIOS/UEFI 保留一部分内存给显卡、固件或安全模块(如 Intel TXT、AMD SVM);内核自身启动时也预留少量内存用于页表、中断向量等底层结构。
-
free -h的total值来自/proc/meminfo中的MemTotal字段,是最权威的“操作系统可见总内存” - 若需确认硬件级标称容量,用
sudo dmidecode -t memory | grep -i size查物理插槽实际容量(需 root 权限) -
lshw -class memory | grep -A 10 "bank"可看每根内存条的型号、频率、是否启用 ECC 等细节
/proc/meminfo 的 MemTotal 和 MemAvailable 区别在哪?
MemTotal 是内核启动时探测并初始化的全部物理内存上限;MemAvailable 是当前可立即分配给新进程的内存估算值,已扣除不可回收缓存、内核不可释放页等。
二者差距大不等于内存泄漏——Linux 把空闲内存优先用于 Buffers 和 Cached,这是设计使然,不是浪费。只要 MemAvailable > 总内存的 10% 且 Swap 的 used 为 0,就说明内存充足。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
cat /proc/meminfo | grep -E "MemTotal|MemAvailable|Buffers|Cached|SwapTotal"可一次性比对关键字段 -
MemAvailable是动态估算,依赖内核版本(3.14+ 才有该字段),旧内核只能靠free第二行的free2近似 - 注意单位:/proc/meminfo 默认是 kB,
free -h自动换算,别手动除 1024 两次
为什么 lsmem 和 dmidecode 显示的内存总量不同?
lsmem 显示的是内核内存管理子系统实际划分的 block 范围(即 /sys/devices/system/memory/ 下的 online memory blocks),反映运行时可用内存布局;dmidecode 读取的是 BIOS 固件报告的 DIMM 物理规格,含未被 OS 启用的插槽或被保留区域。
- 执行
lsmem可看到每个 memory block 的 start/end 地址和 size,总和应 ≈MemTotal -
sudo dmidecode -t memory中Size:行标出每条内存容量,Total Width和Data Width可判断是否启用 ECC - 若某插槽显示
No Module Installed或Size: No Module Installed,说明硬件未插条或 BIOS 未识别
swap 分区大小会影响 free 显示的 total 吗?
不会。free 输出中 Mem: 和 Swap: 是两套独立统计。swap 是磁盘空间模拟的虚拟内存,不计入物理内存总量。
但要注意:free 的 total 值只反映当前 kernel boot 时识别到的 RAM,如果系统启用了内存热拔插(hotplug)或某些安全特性(如 Intel TME、AMD SME)加密部分内存导致不可见,MemTotal 就会变小——这和 swap 完全无关。
- 确认 swap 是否启用:运行
swapon --show,空输出表示没启用 swap - 查看 swap 实际位置和大小:
cat /proc/swaps或lsblk | grep swap - swap 大小设置不当(如设得过大)不会让
free的total变小,但会影响Swap:行的total
free -h 的 Mem: → total 即可,但排查异常时必须逐层比对,尤其当 MemTotal 比预期少 1GB 以上,就得查 BIOS 设置或内核启动参数(如 mem= 限制)。










