| 名称 | jetson-optimize-memory |
| 描述 | >- 通过禁用MB1 BCT、MB2 BCT、内核保留内存(reserved-memory)和SWIOTLB中未使用的子系统来回收DRAM。适用于无头(headless)或无摄像头(no-camera)的Jetson部署;不用于CPU/GPU频率调优。 |
| 版本 | 0.0.1 |
| 开源协议 | “Apache-2.0” argument-hint: "headless |
| 作者 | “Jetson Team” tags: - 内存 - DRAM - 保留内存(carveout) - swiotlb domain: memory |
jetson-optimize-memory
内存按照启动时间顺序在四个层中保留(行越靠上表示越早启动,越靠近硬件):
| 层 | 内容 | 关键文件 |
|---|---|---|
| MB1 BCT | 固件保留区(carveouts) | 每个模块的misc DTS |
| MB2 BCT | 固件加载 + AST控制 | 每个模块的misc DTS |
| 内核DTS | 保留内存和驱动绑定 | 每个模块的DTS |
| SWIOTLB | DMA回弹缓冲池大小 | <module>.conf.common (CMDLINE_ADD) |
关键规则:
- 只有场景配方中的场景经过验证。拒绝任何禁用该表格中未包含的carveout/集群/节点的请求。
- 将carveout清零需要同时执行两步:禁用集群的加载控制,并删除引用它的AST。
- 对配方中的每个集群都要发出显式覆盖,无论源码中的
#ifdef/#else看起来如何。验证合并后的二进制文件。 - GPU软件栈必须与芯片匹配:T234 -> nvgpu,T264及以后 -> OpenRM。遵循
target-platform-contract.md中的共享派生平台规则;遇到不匹配时停止,不要猜测。 - 不要将SWIOTLB设置为0——某些外设无法使用IOMMU。
场景配方
| 关键词 | MB1 BCT carveouts | MB2 BCT | 内核DTS |
|---|---|---|---|
headless |
DCE家族(见芯片表) | DCE auxp_controls + DCE AST |
display@<addr>(以及若暴露的dce@<addr>)→ disabled |
no-camera |
RCE/VI/ISP家族 | RCE auxp_controls(每个实例)+ RCE AST |
建议:VI/ISP/NVCSI → disabled |
芯片特定的carveouts
| 场景 | T234 (Orin) | T264 (Thor) |
|---|---|---|
headless |
CARVEOUT_BPMP_DCE, CARVEOUT_DCE, CARVEOUT_DCE_TSEC, CARVEOUT_TSEC_DCE, CARVEOUT_DISP_EARLY_BOOT_FB |
CARVEOUT_DCE, CARVEOUT_TSEC_DCE, CARVEOUT_HPSE_DCE, CARVEOUT_DISP_EARLY_BOOT_FB |
no-camera |
CARVEOUT_RCE, CARVEOUT_CAMERA_TASKLIST |
CARVEOUT_RCE, CARVEOUT_RCE1, CARVEOUT_RCE_RW, CARVEOUT_VI_TASKLIST, CARVEOUT_VI1_TASKLIST, CARVEOUT_ISP_TASKLIST, CARVEOUT_ISP1_TASKLIST |
启动后:
headless→sudo systemctl set-default multi-user.target。
MB1 BCT carveout覆盖
文件:Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb1-bct-misc-<module>.dts
(例如:Orin Nano的tegra234-mb1-bct-misc-p3767-0000.dts,Thor的tegra264-mb1-bct-misc-p3834-0008-p4071-0000.dts)。
对于每个carveout,在已有的carveout节点内添加:
aux_info@<CARVEOUT_NAME> {
pref_base = <0x0 0x0>;
size = <0x0 0x0>;
alignment = <0x0 0x0>;
};
MB2 BCT集群 + AST覆盖
文件:Linux_for_Tegra/bootloader/generic/BCT/tegra<chip>-mb2-bct-misc-<module>.dts
(包含tegra<chip>-mb2-bct-common.dtsi)。
对于每个目标集群:
- 覆盖
auxp_controls@<index>:auxp_controls@<index> { enable_init = <0>; enable_fw_load = <0>; enable_unhalt = <0>; }; /delete-node/ auxp_ast_config@<idx>;
在common.dtsi中查找索引:auxp_controls@N带有命名其集群的注释;auxp_ast_config@N的ast_region子节点中,carveout = <CARVEOUT_…>;一行标识所有者。
内核DT保留内存
DTB=Linux_for_Tegra/kernel/dtb/<platform-dtb-name>.dtb
dtc -I dtb -O dts -o /tmp/platform.dts $DTB
# 编辑:在目标节点上添加 status = "disabled"
dtc -I dts -O dtb -o $DTB /tmp/platform.dts
显示 — 禁用display@<addr>,以及若作为独立内核节点暴露的dce@<addr>。
摄像头 — 在host1x@<addr>下,仅禁用BSP上实际存在的任意vi*/isp*/nvcsi节点(只发出存在的节点):
在反编译的DTS中定位显示控制器节点并禁用。该节点的单元地址因芯片而异——通过compatible字符串(例如nvidia,tegra234-display)查找,而不是硬编码地址。
host1x@<addr> {
vi0@<addr> { status = "disabled"; };
vi1@<addr> { status = "disabled"; };
isp@<addr> { status = "disabled"; };
isp1@<addr> { status = "disabled"; };
nvcsi@<addr> { status = "disabled"; };
};
SWIOTLB DMA回弹池
NVIDIA IOMMU覆盖外设DMA,因此很少使用SWIOTLB。编辑Linux_for_Tegra/<module>.conf.common中的CMDLINE_ADD(绝不能编辑CMDLINE):
# 总字节数 = swiotlb值 × 2048;4 MiB池:
CMDLINE_ADD="... swiotlb=2048"
覆盖验证(必须)
每次修补MB1/MB2 BCT .dts后,使用与bootloader/tegraflash_impl_t<chip>.py中的bct_flags.append(...)相同的-D…标志复现BSP的编译+反编译:
gcc -E -nostdinc -x assembler-with-cpp \
-DENABLE_<FLAG_1> -DENABLE_<FLAG_2> \
-I bootloader -I bootloader/generic/BCT \
-o /tmp/cpp.dts <patched-bct.dts>
dtc -q -I dts -O dtb -o /tmp/cpp.dtb /tmp/cpp.dts
dtc -q -I dtb -O dts /tmp/cpp.dtb | less
在合并后的输出中确认:
- 每个被清零的
aux_info@<NAME>(或宏展开后的aux_info@<id>U)都有size = <0x0 0x0>和pref_base = <0x0 0x0>。 - 每个被禁用的
auxp_controls@<idx>的三个enable_*字段均为<0>。 - 每个被
/delete-node/的auxp_ast_config@<idx>都已不存在。
验证(在启动后的目标上)
sudo cat /proc/iomem | grep -iE 'nv-reserved|cma|fb|carveout'
ls /proc/device-tree/reserved-memory/
dmesg | grep -iE 'firmware|carveout|bpmp|reserved|fail|error' | head -20
free -m
| 场景 | Sysfs | dmesg grep |
|---|---|---|
| 关闭显示 | ls /sys/class/drm/(空) |
tegra-drm|nvdisplay|dce|host1x|fb0 |
| 关闭摄像头 | ls /dev/video* 2>/dev/null(无) |
rce|nvcsi|tegra-camera|vi0|vi1|isp |
| SWIOTLB收缩 | cat /sys/kernel/debug/swiotlb/io_tlb_nslabs 与命令行匹配 |
swiotlb |
对于SWIOTLB:/proc/cmdline必须包含swiotlb=<value>,并且watch -n5 cat /sys/kernel/debug/swiotlb/io_tlb_used在完整工作负载下必须保持在io_tlb_nslabs之下——如果超过,恢复原始CMDLINE_ADD并重新烧录kernel-dtb。
目的
当Jetson部署跳过显示、摄像头或其他外设时,削减参考BSP中默认启用的未使用DRAM carveout,将释放的字节留给应用程序。始终按启动顺序编辑四个层,以便早期阶段的carveout永远不会掩盖后期阶段的收缩。
先决条件
- 按照
../../context/target-platform-contract.md解析有效的目标配置文件。 - BSP镜像是提取的且源码树已初始化(
/jetson-init-image、/jetson-init-source已完成)。 - 对于headless / no-camera配方:确认工作负载确实不需要显示或摄像头。
限制
- 仅暴露经过验证的配方(
headless、no-camera、swiotlb);不接受配方集之外的临时子系统禁用。 - SWIOTLB收缩受峰值传输中DMA限制——如果超过新的
io_tlb_nslabs,则需要还原更改。 - BPMP-DTB编辑仅在Customize + Build + Deploy运行后落入叠加跟踪器;此技能本身不烧录。
故障排除
- MB1 BCT carveout禁用后启动失败 — 恢复原始misc DTS并重新烧录;缺失的carveout对当前SoC是必需的。
io_tlb_used超过io_tlb_nslabs— 还原CMDLINE_ADD中的swiotlb=并重新烧录内核DTB分区。- 回收的增量比预期小 — 验证配方确实匹配部署(例如显示仍然连接);使用本文件中的
dmesg | grep -iE 'firmware|carveout'检查来确认。 - 验证
dmesg显示被禁用的子系统仍在探测 — 变更可能没有提升到bsp_image;重新运行/jetson-promote-image。