ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

18_实验十七_其他命令与自定义启动变量

18_实验十七_其他命令与自定义启动变量 实验十七 其他命令与自定义启动变量——run 一键切换启动方式第 4 章收官对应课件《第4章 使用U-Boot》4.8 节Slide 51-55系列说明本系列基于华清远见 FS-MP1ASTM32MP157A开发板对应课件《第4章 使用U-Boot》。第 4 章最后一篇三条边角命令reset/run/go——其中run是真正的主角环境变量里不只bootcmd一条能装命令自定义变量 run可以做出任意多个启动快捷方式在网络启动与 eMMC 启动之间一键切换课件例 3。这是 Linux 系统调试期的日常动作同一块板多种启动路径随取随用。本文覆盖 Slide 51-55。前置实验十六bootcmd 网络启动已跑通eMMC 分区里有内核文件。一、本篇的三条命令命令干什么本篇安排reset重启开发板步骤 1 动手其实前几篇一直在偷用run 变量名执行环境变量里定义的命令串步骤 2 主角——自定义启动变量go addr [arg ...]跳到 DRAM 指定地址直接执行程序步骤 3 认格式二、实验环境实际项目实际值板子状态trusted 版 U-Boot倒计时 5 秒STM32MP可达串口MobaXterm Serial 会话115200新机上实测COM10会话标题栏为STMicroelectronics STLink Virtual COM Port (COM10)2026-09-24COM11是旧电脑的值换机后一律以 Windows 设备管理器里的 ST-Link 串口号为准网络Ubuntu 侧tftpd-hpa运行中/home/cnu/tftpboot有uImagestm32mp157a-fsmp1a-mipi050.dtb实验十三/十六eMMC2 号bootfsext4里三样都在实验十五步骤 1 实测清单出厂uImage7,546,640、配套stm32mp157a-fsmp1a-mipi050.dtb71,805、本篇自己写进去的test_uImage7,546,640——mybootemmc 要的两个文件已齐环境变量基线网络三件套 serveripbootdelay 5 实验十六固化的bootcmd网络启动三连开工自检10 秒上电先看Hit any key to stop autoboot:后面那个数字——若是0换过板子、重新分区烧写后最容易回到 0先补一句setenv bootdelay 5saveenvenv set/env save等价写法再reset往后每次拦停都来得及按 Enter。做法见《实验十二》步骤 1 与步骤 4。三、课件 ↔ 步骤对应表课件 Slide内容对应步骤51reset 命令步骤 152run 命令与它的最大用途步骤 253~54例 3mybootemmc / mybootnet 自定义启动变量步骤 255go 命令格式步骤 3本篇动作 → 后面谁用 → 现在含糊的后果本篇动作后面哪里还会用现在含糊的后果两条自定义启动变量mybootnet/mybootemmc已 saveenv第 5 章换上自己编的内核与设备树后这两条就是日常改完就run一把的快捷方式改文件名即可第 6 章做 NFS 根时再加一条mybootnfs也是同一套路每次调试都手敲三条长命令容易丢分号、丢占位减号出错后还以为内核编坏了认下回显里出现TFTP就是走网络、出现bytes read就是走分区第 5、6 章排我到底启动的是哪份内核时的第一手判据两条路径的终点日志长得几乎一样分不清启动的是网络那份还是板上那份第 5 章替换内核后极易误判会看 TF-A 的Reset reason0x54 软复位 / 0x214 看门狗第 5、6 章内核起不来、反复复位时的定位入口把看门狗复位当成板子供电不稳白折腾硬件认下run与bootcmd是同一机制都是执行一个环境变量第 6 章要动bootargs、第 7 章之后可能整条换启动流程以为启动方式是固件里写死的东西不敢改、不会改本篇不需要任何新资料mybootnet用的两个文件在/home/cnu/tftpbootmybootemmc用的两个文件在 eMMC 2 号bootfs实验十五步骤 1 实测清单。四、实验步骤步骤 1reset——正式认识老朋友Slide 51前几篇的复位重来用的就是它现在正式打个照面STM32MP reset图课件 Slide 51——reset后输出resetting ...复位后 TF-A 重新接管日志里能看到 PSCI Power Domain Map、CPU/Model 信息、Reset reason (0x54): System reset generated by MPU (MPSYSRST)、Boot partition fsbl1、BL2 构建信息等一段完整的引导链开场。resetting ...之后整条引导链从头跑TF-A → U-Boot 横幅 → 倒计时 5 秒——和按板上复位键等效课件截图里还能看到 TF-A 报的Reset reason软复位也会留痕。倒计时内按 Enter 拦停继续本篇。实际执行结果2026-09-24 实测课件那句Reset reason (0x54)我们板上一字不差STM32MP reset resetting ... INFO: PSCI Power Domain Map: INFO: Domain Node : Level 1, parent_node -1, State ON (0x0) INFO: Domain Node : Level 0, parent_node 0, State ON (0x0) INFO: CPU Node : MPID 0x0, parent_node 0, State ON (0x0) INFO: CPU Node : MPID 0xffffffff, parent_node 0, State OFF (0x2) NOTICE: CPU: STM32MP157AAA Rev.Z NOTICE: Model: HQYJ FS-MP1A Discovery Board INFO: Reset reason (0x54): INFO: System reset generated by MPU (MPSYSRST) INFO: Using SDMMC INFO: Instance 1 INFO: Boot used partition fsbl1 NOTICE: BL2: v2.2-r1.0(debug):a70053f NOTICE: BL2: Built : 09:55:29, Nov 5 2020 ... INFO: RAM: DDR3-DDR3L 16bits 533000Khz INFO: Memory size 0x20000000 (512 MB) INFO: BL2 runs SP_MIN setup ... WARNING: Skip signature check (header option) NOTICE: ROTPK is not deployed on platform. Skipping ROTPK verification. NOTICE: BL2: Booting BL32 ... NOTICE: SP_MIN: v2.2-r1.0(debug):a70053f ... U-Boot 2020.01-stm32mp-r1-g88f08870-dirty (Sep 19 2026 - 14:51:04 0800) CPU: STM32MP157AAA Rev.Z Model: STMicroelectronics STM32MP157A-DK1 Discovery Board Board: stm32mp1 in trusted mode (st,stm32mp157a-dk1) DRAM: 512 MiB ... WDT: Started with servicing (32s timeout) NAND: 0 MiB MMC: STM32 SD/MMC: 0, STM32 SD/MMC: 1 Loading Environment from MMC... OK In: serial Out: serial Err: serial Net: eth0: ethernet5800a000 Hit any key to stop autoboot: 0图实测串口——reset→resetting ...之后 TF-A 从头接管PSCI Power Domain Map四行、CPU: STM32MP157AAA Rev.Z、Model: HQYJ FS-MP1A Discovery Board接着Reset reason (0x54): System reset generated by MPU (MPSYSRST)再往下Boot used partition fsbl1、BL2/SP_MIN 的构建串、Memory size 0x20000000 (512 MB)然后才是 U-Boot 横幅与Loading Environment from MMC... OK。中间那几行WARNING: Skip signature check/ROTPK is not deployed是实验十一就解释过的未烧信任根跳过验签属正常。四条读法Reset reason (0x54) MPSYSRSTMPU 发起的软复位与课件 Slide 51 完全一致——也就是说reset命令和按板上复位键在芯片层面留下的是同一个痕迹。这条以后排障有用TF-A 每次开场都报复位原因能区分软件复位0x54、“看门狗复位”实验十六见到的0x214 / IWDG2 Reset、“上电复位”。Model两行不一样不是 bugTF-A 报HQYJ FS-MP1A Discovery Board华清出厂 TF-A 的设备树U-Boot 报STMicroelectronics STM32MP157A-DK1 Discovery Board我们移植时以 DK1 为模板第 3 章 F 系列没改这一处。同一块板、两级固件、两套设备树实验十六的内核日志里还有第三种HQYJ STM32MP157 FSMP1A MIPI Discovery Board。Boot used partition fsbl1TF-A 自己报告它从 SD 卡 1 号分区实验四分的fsbl1被读起来——与实验十四mmc part那张表对得上fsbl1就是 1 号分区256 KiB。Loading Environment from MMC... OK环境变量从 SD 卡读回来了实验十六固化的bootcmd与本篇即将写入的两个变量都存在那里——所以下面saveenv之后重启mybootnet/mybootemmc还在。步骤 2run 自定义启动变量——例 3 落地Slide 52~54场景课件例 3 原文大意调试 Linux 系统时常常要在网络启动和 eMMC 启动之间来回切换。bootcmd只有一条换来换去就得反复重写——麻烦。解法自定义两个环境变量各存一条启动路径切换时run一下即可。创建两条自定义启动变量文件名与分区号按实验十四/十五的实测替换此处沿用课件的mmc 1:2与我们统一的两个下载地址STM32MP setenv mybootnet tftp c2000000 uImage;tftp c4000000 stm32mp157a-fsmp1a-mipi050.dtb;bootm c2000000 - c4000000 STM32MP setenv mybootemmc ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157a-fsmp1a-mipi050.dtb;bootm c2000000 - c4000000 STM32MP saveenv图课件 Slide 54——创建 mybootemmc 与 mybootnet 两条环境变量值都是加载内核 加载设备树 bootm 启动三连区别只在加载手段ext4load 从 eMMC 分区取 / tftp 从网络取课件红字特别标注 bootm 参数里的占位减号两侧必须有空格。对比两条变量命令骨架一字不差只有从哪拿文件不同——这正是 run 机制的价值启动方式是数据环境变量不是写死在代码里的流程。ext4load 的文件名以实验十五步骤 1 那份实测清单为准我们板上uImage与stm32mp157a-fsmp1a-mipi050.dtb两个都在 2 号分区里所以上面那条mybootemmc原样可用分区里另有实验十五写进去的test_uImage想练换内核可以把第一个文件名换成它。两个文件名都得真实存在ext4load 找不到文件会直接报错后面的 bootm 自然失败——所以照抄之前先ext4ls mmc 1:2扫一眼最稳。然后各跑一遍STM32MP run mybootnet图课件 Slide 54——run mybootnet网络启动路径效果与实验十六的 bootcmd 完全同款两条 tftp bootm 内核日志。STM32MP run mybootemmc图课件 Slide 54——run mybootemmceMMC 启动路径两条ext4load的回显是N bytes read in ... MiB/s随后同样## Booting kernel ...接Starting kernel ...。mybootemmc 的独立验证跑它之前把网线拔了或干脆关掉 Ubuntu 那侧的tftpd-hpa——启动全程不碰网络内核日志照滚。这一遍跑通文件已经在板上才算铁证。两条 run 的终点都和实验十六一样内核日志滚出、止于根文件系统问题——预期内。拔线之前先知道一件事实验十六已把bootcmd固化成网络三连所以拔线后上电自动启动会干等几轮 tftp 超时才落回STM32MP几十秒属正常不是死机见注意事项 5嫌烦就先setenv bootcmd赋空saveenv把自动启动关掉练完再恢复。顺带把 run 和 bootcmd 的关系说破autoboot 倒计时归零后执行的bootcmd本质上也是被 run 执行的一条环境变量——run bootcmd与run mybootnet在机制上毫无区别只是前者有个响亮的官方名字。mybootnet与bootcmd当前内容相同也互不干扰——一个是默认自动一个是手动点名。实际执行结果2026-09-24 实测两条路径都跑通① 建变量 落盘。三条命令原样敲下去STM32MP setenv mybootnet tftp c2000000 uImage;tftp c4000000 stm32mp157a-fsmp1a-mipi050.dtb;bootm c2000000 - c4000000 STM32MP setenv mybootemmc ext4load mmc 1:2 c2000000 uImage;ext4load mmc 1:2 c4000000 stm32mp157a-fsmp1a-mipi050.dtb;bootm c2000000 - c4000000 STM32MP saveenv Saving Environment to MMC... Writing to redundant MMC(0)... OK图实测串口——两条setenv各自把一长串命令塞进变量整条值外面必须有单引号否则分号和空格会被 shell 吃掉saveenv打Saving Environment to MMC... Writing to redundant MMC(0)... OK。注意这次写的是redundant MMC(0)冗余副本而实验十六那次打的是Writing to MMC(0)主副本——U-Boot 的环境是两份交替写的实验十二就见过这两句一份写坏还有另一份兜底。看到redundant不是出错别去找为什么和上次不一样。② 两条路径各跑一遍。run mybootnet网络取文件图实测录屏——录屏从上电开始U-Boot 横幅WDT: Started with servicing (32s timeout)、MMC: STM32 SD/MMC: 0, STM32 SD/MMC: 1、Loading Environment from MMC... OK、Net: eth0: ethernet5800a000→ 倒计时拦停落回STM32MP→ 执行run mybootnet走的是两条tftpbootm。Loading Environment from MMC... OK这一行就是变量真的存进 SD 卡了的证据——上电时 U-Boot 已经把包含mybootnet/mybootemmc的整套环境读了回来。run mybootemmceMMC 分区取文件图实测录屏——同样的开场横幅 拦停随后执行run mybootemmc。两条 run 的终点几乎一样内核起来、日志滚出、止于根文件系统问题——因为骨架本来就一字不差差别只在文件从哪来。怎么确认mybootemmc真的走的是 eMMC 而不是偷偷用了网络看回显里的取文件那一行长什么样就够了run mybootnettftprun mybootemmcext4load取文件的回显特征TFTP from server 192.168.0.100; our IP address is 192.168.0.8、Bytes transferred 7546640 (732710 hex)7546640 bytes read in 201 ms (35.8 MiB/s)实验十五步骤 2 实测过的格式整屏不会出现任何TFTP或服务器 IP依赖网线 Ubuntu 的tftpd-hpa在线只要分区里那两个文件在拔了网线照样跑速度量级本篇实测 927 KiB/s ~ 1.7 MiB/s网络35 MiB/s 量级本地 eMMC所以独立验证的做法就是上面说的拔网线再run mybootemmc——如果它照样滚出内核日志就证明文件确实在板上、这条路径不依赖任何外部设备。这也是第 5、6 章调试期的日常操作改一次内核就run mybootnet从网络快速验证稳定后再落盘用run mybootemmc。步骤 3go——认识格式即可Slide 55go addr [arg ...]图课件 Slide 55——go命令格式文本go addr [arg ...]——跳到 DRAM 的 addr 处执行程序。go的用途是跳转到 DRAM 里的裸程序直接执行——U-Boot 不再参与CPU 从那个地址开始跑。本阶段我们手里没有裸机程序可跳格式记住即可将来若玩到裸机小程序不经过内核直接在板上跑的代码tftp下载后go一敲就能运行。实际执行结果本篇按课件要求只认格式、不动手我们手里没有可跳的裸机程序go到内核镜像那种带头的文件上也不会正常执行无实测记录。步骤 4第 4 章收官盘点到本篇为止第 4 章 4.1~4.8 全部过手。一张命令地图收尾分组命令出处帮助与查询help/?、bdinfo、printenv、version实验十二4.1~4.2环境变量setenv/saveenv/env bootcmd、bootargs、网络四件套实验十二4.3网络ping、dhcp、tftp、nfs实验十三4.4存储mmc info/list/dev/part/readwrite/erase/hwpartition 只认不动实验十四4.5文件系统ext4ls/ext4load/ext4write实验十五4.6启动内核bootm/bootz/boot/bootd实验十六4.7杂项reset/run/go本篇4.8此刻板子的能力能查询、能改配置、能从服务器拉文件、能读写 eMMC 里的文件、能手动或一键bootcmd/myboot 系列启动 Linux。U-Boot 这间操作台已经全部摸熟——第 5 章《移植 Linux 内核》进场时每一样都是熟具。实际执行结果2026-09-24上表逐组都对得上我们自己的实测记录——help/bdinfo/printenv/version见实验十二环境变量与saveenv两份副本见实验十二与本篇步骤 2ping/tftp/dhcp/nfs见实验十三含 nfs 两发对照mmc五条见实验十四含 eMMC 五分区地图ext4 三条见实验十五含出厂文件清单与test_uImage落盘bootm见实验十六Linux 5.4.31 首次点火reset/run见本篇步骤 1、2。go与bootz、mmc write/erase/hwpartition一样属于认格式不动手的那一档。五、注意事项自定义变量的值必须整体加引号bootm 参数里的占位减号两侧空格不能丢课件红字强调过——bootm c2000000 - c4000000。文件名与分区号以板上实测为准mybootemmc 的 ext4load 路径按实验十四分区表 实验十五清单填两个文件缺一个这条路径就跑不通。mybootemmc 与 mybootnet 都是 write-once 无关的普通变量随便改随便删setenv mybootemmc赋空即删练坏了env default -a之外的恢复手段就是重新 setenv——比 bootcmd 的后果轻得多放心玩。run 的报错会一路串下去变量里三条命令用分号串联前一条失败如 ext4load 找不到文件后一条照跑——看到 bootm 报Wrong Image Format时回头查的是第一条 load 有没有成功。终端粘贴用右键两条 setenv 长命令整体复制粘贴。六、怎么验证reset实测TF-A 横幅重滚、5 秒倒计时、拦停正常——已实测resetting ...→Reset reason (0x54): System reset generated by MPU (MPSYSRST)→ BL2/SP_MIN → U-Boot 横幅 →Loading Environment from MMC... OKrun mybootnet网络路径启动内核tftpd-hpa在线时——已实测录屏见步骤 2 ②run mybootemmc拔网线或关掉tftpd-hpa后仍能启动内核——eMMC 路径独立可用——已实测联网状态下跑通这条路径用的是ext4load回显是N bytes read、全程没有任何TFTP字样本身就说明文件来自板上分区拔线复验只是把这个结论钉得更死print mybootnet mybootemmc能查验两条变量已存盘——已实测saveenv打Writing to redundant MMC(0)... OK且下次上电Loading Environment from MMC... OK把它们读了回来go的格式与用途说得出addr 是 DRAM 地址跳过去执行裸程序——已认知本篇不动手见步骤 3。不达标时的排查现象先查什么run mybootemmc读不到文件于是 bootm 也起不来文件名或分区号与清单对不上——先ext4ls mmc 1:2看一眼实际有什么再核对号eMMC 的 bootfs 是1:2、SD 卡的是0:4run mybootemmc的 bootm 报 Wrong Image Formatext4load 是否真的成功bytes read 回显加载地址是否c2000000run mybootnet卡在 Loading老三样按顺序查sudo service tftpd-hpa status在不在跑 → 文件权限是不是又变回 700 → 板子网口灯亮不亮实验十三的排查表与坑 7、坑 8 原样适用两条变量重启后消失saveenv 做了吗实验十二的纪律七、实验完成标志reset实测TF-A 起的完整引导链重跑一遍步骤 1 实测resetting ...→Reset reason (0x54) MPSYSRST→ BL2/SP_MIN → U-Boot 横幅 →Loading Environment from MMC... OK与课件 Slide 51 那句复位原因一字不差mybootnet/mybootemmc创建 saveenv步骤 2 实测两条setenv整串加单引号saveenv打Writing to redundant MMC(0)... OK——这次写的是冗余副本与实验十六那次的主副本交替run mybootnet启动内核成功步骤 2 实测走两条tftprun mybootemmc启动内核成功——走两条ext4load回显是N bytes read、全程无TFTP字样证明文件取自板上 2 号bootfs步骤 2 实测拔网线复验为加强项本遍在联网状态下完成go格式与用途认知步骤 3 按课件只认格式无实测记录第 4 章命令地图盘点完成各组命令都能对上我们自己的实测篇目步骤 4 已逐组核对八、下一步第 5 章《移植 Linux 内核》第 4 章到此收官。回看第 3 章埋下的那条线autoboot 里 bootm 找不到内核的报错在实验十六已经有了答案的一半——内存里有内核就能点火另一半在第 5 章揭晓——怎么用源码编出自己的内核和设备树替换掉这篇借来的出厂内核。配套的实验环境、内核源码包与编译流程下章开篇见。
返回列表