jetson-optimize-memory について
Jetson BSP のメモリ最適化向けスキルで、検証済みの headless、no-camera、SWIOTLB レシピを使い、ファームウェア、デバイスツリー、DMA バッファーを調整します。対象周辺機器を使わず DRAM を確保したい構成向けで、変更の検証が必要ですが、デバイスへの書き込みは行いません。
主な機能
- 013 種類の検証済み最適化レシピ
- 02起動各層の carveout 調整
- 03カーネルデバイスツリーの編集
- 04SWIOTLB DMA バッファープールの縮小
- 05統合設定と起動後の検証
活用シーン
- 01ヘッドレス構成で予約メモリを回収
- 02カメラなし構成で carveout を削減
- 03SWIOTLB を調整して DMA バッファーを縮小
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ nvidia/ skills --skill jetson-optimize-memoryインストール後、Claude Code で/jetson-optimize-memoryを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
BENCHMARK.mdskill-card.mdskill.oms.sigevals/evals.json詳細
jetson-optimize-memory
メモリは、起動時系列の順に並んだ4つのレイヤーにわたって確保されます (上の行ほど起動時の順序が早く、ハードウェアに近いことを示します)。
| レイヤー | 内容 | 主なファイル |
|---|---|---|
| MB1 BCT | ファームウェアのカーブアウト | モジュールごとの misc DTS |
| MB2 BCT | ファームウェアの読み込み + AST 制御 | モジュールごとの misc DTS |
| Kernel DTS | reserved-memory とドライバーのバインド | モジュールごとの DTS |
| SWIOTLB | DMA バウンスプールのサイズ | <module>.conf.common(CMDLINE_ADD) |
重要なルール:
- 検証済みなのは、シナリオレシピに記載されたシナリオのみです。その表にないカーブアウト/クラスター/ノードの無効化を求められた場合は、拒否してください。
- カーブアウトをゼロにするには、クラスターの読み込み制御を無効化し、それを参照する AST を削除する必要があります。
- レシピに含まれるすべてのクラスターについて、ソースの
#ifdef/#elseの状態に関係なく、明示的なオーバーライドを出力してください。 マージ後のバイナリを検証してください。 - GPU ソフトウェアスタックはチップに合わせる必要があります:T234 は nvgpu、T264 以降は OpenRM です。
target-platform-contract.mdにある共通の派生プラットフォームルールに従い、不一致があれば推測せず処理を停止してください。 - SWIOTLB を 0 に設定しないでください。一部の周辺機器は IOMMU を使用できません。
シナリオレシピ
| キーワード | MB1 BCT カーブアウト | MB2 BCT | Kernel DTS |
|---|---|---|---|
headless | DCE ファミリー(チップ表を参照) | DCE auxp_controls + DCE AST(s) | display@<addr>(および公開されている場合は dce@<addr>)→ 無効化 |
no-camera | RCE/VI/ISP ファミリー | RCE auxp_controls(各インスタンス)+ RCE AST(s) | 推奨:VI/ISP/NVCSI → 無効化 |
チップ固有のカーブアウト
| シナリオ | 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 カーブアウトのオーバーライド
ファイル: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 ノード内に追加します。
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 には所有者を特定する carveout = <CARVEOUT_…>; の行を含む ast_region 子ノードがあります。
Kernel DT reserved-memory
DTB=Linux_for_Tegra/kernel/dtb/<platform-dtb-name>.dtb
dtc -I dtb -O dts -o /tmp/platform.dts $DTB
# edit: status = "disabled" on target nodes
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 は絶対に編集しないでください)。
# Total bytes = swiotlb_value × 2048; 4 MiB pool:
CMDLINE_ADD="... swiotlb=2048"
オーバーライドの検証(必須)
MB1/MB2 BCT の各 .dts にパッチを適用した後、BSP のコンパイルとデコンパイルを、bootloader/tegraflash_impl_t<chip>.py の bct_flags.append(...) と同じ -D… フラグを使って再現します。
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>で、3 つすべての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 が cmdline と一致 | 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 カーブアウトを削減し、解放されたバイトをアプリケーションに割り当てます。起動順序に従って常に 4 つのレイヤーを編集し、初期段階のカーブアウトが後段の縮小に優先しないようにします。
前提条件
../../context/target-platform-contract.mdに従ってアクティブなターゲットプロファイルが解決されていること。- BSP イメージが展開され、ソースツリーが初期化されていること(
/jetson-init-image、/jetson-init-sourceが完了していること)。 - ヘッドレス/カメラなしのレシピの場合、ワークロードでディスプレイまたはカメラが本当に不要であることを確認してください。
制限事項
- 検証済みのレシピ(
headless、no-camera、swiotlb)のみを利用できます。レシピに含まれないサブシステムの個別の無効化は拒否されます。 - SWIOTLB の縮小は、処理中の DMA のピーク量によって制限されます。新しい
io_tlb_nslabsを超えた場合は変更を元に戻す必要があります。 - BPMP-DTB の編集がオーバーレイトラッカーに反映されるのは、Customize + Build + Deploy の実行後です。このスキル自体でフラッシュは行いません。
トラブルシューティング
- MB1 BCT のカーブアウト無効化後に起動できない — 元の misc DTS を復元して再フラッシュしてください。該当のカーブアウトはアクティブな SoC に必須です。
io_tlb_usedがio_tlb_nslabsを超える —CMDLINE_ADDのswiotlb=を元に戻し、カーネル DTB パーティションを再フラッシュしてください。- 再利用可能になった容量が想定より少ない — レシピが実際のデプロイ構成に合致していること(例:ディスプレイが接続されたままになっていないこと)を確認してください。このファイルの
dmesg | grep -iE 'firmware|carveout'チェックを使って確認します。 - 検証時の
dmesgに、無効化したサブシステムが引き続きプローブされていると表示される — 変更がbsp_imageに反映されていない可能性があります。/jetson-promote-imageを再実行してください。