Jetson内存优化Skill jetson-optimize-memory

该技能用于在无显示或无摄像头部署中回收Jetson设备DRAM。通过修改MB1 BCT、MB2 BCT、内核设备树和SWIOTLB配置,禁用未使用的显示/摄像头相关carveout、AST和控制节点,释放内存。关键词:Jetson、内存优化、DRAM、BCT、DTS、SWIOTLB、headless、no-camera、carveout、BSP。

BSP与板级支持 0 次安装 0 次浏览 更新于 9/6/2026
名称 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

启动后: headlesssudo 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)。

对于每个目标集群:

  1. 覆盖auxp_controls@<index>
    auxp_controls@<index> {
        enable_init    = <0>;
        enable_fw_load = <0>;
        enable_unhalt  = <0>;
    };
    
  2. /delete-node/ auxp_ast_config@<idx>;

common.dtsi中查找索引:auxp_controls@N带有命名其集群的注释;auxp_ast_config@Nast_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配方:确认工作负载确实不需要显示或摄像头。

限制

  • 仅暴露经过验证的配方(headlessno-cameraswiotlb);不接受配方集之外的临时子系统禁用。
  • 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