
实验二十 编译内核与设备树——第一次编出自己的 uImage 和 fsmp1a.dtb对应课件《第5章 移植Linux内核》5.4 节步骤 3~4Slide 41~46系列说明本系列基于华清远见 FS-MP1ASTM32MP157A开发板对应课件《第5章 移植Linux内核》。地基打好实验十九本篇一口气产出第 5 章最重要的两个文件自己编的uImage和自己编的stm32mp157a-fsmp1a.dtb。编完先不改任何东西——这份零修改内核加上老师给的设备树就是我们后面移植 eMMC、网卡驱动的底版eMMC 驱动和网卡驱动是实验二十一、二十二的事。前置实验十九源码、23 个补丁、配置、两套工具全部就位。一、本篇要产出的两个文件和它们的去处产出生成位置后面怎么用arch/arm/boot/uImage编内核的终点产物拷进/home/cnu/tftpboot实验二十三tftp c2000000 my_uImage点火arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb编设备树的产物同上tftp c4000000 stm32mp157a-fsmp1a.dtb与出厂件的区别只在谁编的出厂uImage是华清拿 ST 包编的7,546,640 字节我们这份大小不会一样——大小不同没关系能不能点火由实验二十三验收。还有一个更好认的记号我们编的 uImage 版本串带 git 哈希Linux-5.4.31-g哈希实验十九步骤 3.3 说过原因出厂那份是干净的Linux-5.4.31——以后从 U-Boot 的Image Name:一行就能看出点的哪份内核。二、实验环境实际项目实际值操作位置Ubuntu 虚拟机实验十九那棵源码树在共享目录~/Desktop/LINUX-gy/Test2/...或本地~/kernel/linux-5.4.31/以你实际位置为准编译器arm-none-linux-gnueabihf-实验十九装的 ARM 官方 gcc 9.2配置基线.config由multi_v7_defconfig fragment 合并而来已存档stm32_fsmp1a_defconfig板子本篇不开编译全程在虚拟机开工自检10 秒四条都在才开工——① 当前目录是内核源码顶层提示符末段是linux-5.4.31层级图与认层判据见实验十九步骤 3不在就cd过去完整路径见步骤 3 的①②ls arch/arm/configs/stm32_fsmp1a_defconfig实验十九的存档③mkimage -V有版本输出实验十九装的 u-boot-tools④arm-none-linux-gnueabihf-gcc单独敲一下报没有输入文件编译器在 PATH。哪条不对回实验十九对应步骤。三、课件 ↔ 步骤对应表课件 Slide内容对应步骤41顶层 Makefile 加 ARCH/CROSS_COMPILE 两行步骤 141~42make uImage LOADADDR0xC2000040产物在 arch/arm/boot步骤 243设备树参考 dk1新增 fsmp1x.dtsi fsmp1a.dts老师提供步骤 344dts/Makefile 加一行使新设备树被编译步骤 445make dtbs产物 stm32mp157a-fsmp1a.dtb步骤 546此刻点火会怎样无根文件系统的结局步骤 6认知本篇动作 → 后面谁用 → 现在含糊的后果本篇动作后面哪一篇要用现在含糊的后果顶层 Makefile 的ARCH : arm、CROSS_COMPILE : arm-none-linux-gnueabihf-两行实验二十一、二十二每次重编译——写一次管到第 5 章结束不写就得每条 make 命令都带ARCHarm CROSS_COMPILE...长命令更容易错LOADADDR0xC2000040实验二十三点火时 uImage 落在 0xC2000000、真身在 0x40实验十六实测互证写成 0xC2000000U-Boot 头说好的入口和实际代码错位点火失败stm32mp157a-fsmp1a.dtb我们的设备树实验二十一、二十二改的就是它的源文件实验二十三点火要用它误用出厂mipi050.dtb替代则后面改驱动的步骤全部白做两个产物的字节数记录实验二十三点火后与 tftp 的Bytes transferred对账拷错文件、下错版本都发现不了本篇需要的资料kernel-初始设备树.zip2,226 字节md538190d0400d9504bebc3caaf48ed6fed——里面是老师提供的两个设备树源文件步骤 3 解压使用。四、实验步骤步骤 1顶层 Makefile 加两行Slide 41打开内核源码顶层Makefile定位到第 360 行——ARCH与?之间隔的是两个 Tab课件截图里看着像空格grep-n? $(SUBARCH)Makefile# 应打出360:ARCH ? $(SUBARCH)为什么不能搜grep -n ARCH ? Makefile那是在搜ARCH空格?这个字面串而第 360 行里ARCH与?之间是两个Tab字符——字面对不上grep 会一行不中、无声地回到提示符本系列实测踩过这一下。搜? $(SUBARCH)这段不含 Tab 的尾巴就能绕开且全文只有第 360 行有它单引号让$、(都按字面字符处理不必转义。用 nano 改 Makefile——四步走① 打开当前目录就在内核源码顶层nanoMakefilenano 界面底部两排是快捷键提示^代表 Ctrl 键比如^O就是 CtrlO。② 定位到第 360 行按CtrlWWhere Is搜索输入? $(SUBARCH)后回车——光标落到第 360 行ARCH ? $(SUBARCH)上这段字符全文唯一不会跳错。想按行号跳也行Ctrl_等价 AltG输入360回车。③ 插入两行用方向键把光标移到第 360 行的行尾$(SUBARCH)的右括号后面按一次回车新起一行然后逐字敲入下面两行——顶格、不要缩进:两侧各一个空格gnueabihf-结尾的连字符一个都不能丢必须与实验十九装的那套编译器一字不差ARCH : arm CROSS_COMPILE : arm-none-linux-gnueabihf-敲完后 360 行附近应长这样新旧行之间没有空行ARCH ? $(SUBARCH) ARCH : arm CROSS_COMPILE : arm-none-linux-gnueabihf- # Architecture as present in compile.h④ 保存并退出CtrlO保存→ 底部提示File Name to Write: Makefile→直接回车确认文件名CtrlX退出回到终端。这套 nano 键位CtrlW搜索定位 /CtrlO保存回车 /CtrlX退出是本系列的通用手艺——实验二十一、二十二改设备树实验三十一改 Makefile实验二十六写 etc 四件套全是同一套动作后续各篇不再重复展开。图实测顶替课件 Slide 41——nano 4.8 里改好的样子绿框两行就是新增的ARCH : arm与CROSS_COMPILE : arm-none-linux-gnueabihf-插在ARCH ? $(SUBARCH)与# Architecture as present in compile.h之间与上面敲完后应长这样的预期逐行一致。顺手认一眼 nano 的中文底栏^O 写入、^X 离开、^W 搜索——正是本步骤那套键位这台 Ubuntu 是中文环境快捷键含义不变标题栏已更改表示改动尚未保存截图时还没按 CtrlO。这两行就是实验十九讲的前缀落地点从此每条 make 命令都自动带上架构与编译器前缀不用再写ARCHarm CROSS_COMPILE...两种写法等价课件选择写死在 Makefile 里我们照做后面实验十九那些make ARCHarm xxx_defconfig命令多写一遍ARCHarm也无害。就地验证改完立刻做grep-n^ARCH : armMakefile# 应打出新增那行grep-n^CROSS_COMPILE : arm-noneMakefile# 应打出新增那行gitdiff--stat# 应只有 Makefile 一处、2 行步骤 2编内核——make uImage LOADADDR0xC2000040Slide 41~42makeuImageLOADADDR0xC2000040-j4-j44 线程并行第一次编 20~40 分钟后面的重编只需几分钟——make 只重编改动过的文件。虚拟机只分了 4GB 内存的话-j4编译中途可能被杀终端打出Killed、编译戛然而止——那是内存耗尽的 OOM不是源码问题改用make uImage LOADADDR0xC2000040 -j2接着编即可进度保留第 3 章编 U-Boot 的老经验LOADADDR0xC2000040uImage 头里记录的内核加载/入口地址。实验十六实测过uImage 放在 0xC2000000头占 0x40真身从 0xC2000040 开始——这个参数就是把这层关系写死进镜像头里。漏了它会用默认值点火必挂且难查。编完验证ls-larch/arm/boot/uImage arch/arm/boot/zImage# uImage 应比 zImage 恰好大 64 字节四兄弟加工链的现场版# 两个字节数都记下来——实验二十三点火时与 tftp 的 Bytes transferred 对账实际执行结果图实测——编译收尾与ls -l产物对账uImage7,313,872 字节、zImage 7,313,808恰差 64 字节内核文件四兄弟账目的现场版Image Name: Linux-5.4.31-g77fcad789-dirty兑现实验十九预告的 git 版本串-dirty 步骤 1 那两行还没提交Load Address/Entry Point均为c2000040与实验十六出厂件互证(uncompressed) 负载是自解压的 zImage、mkimage 不做二次压缩。绿箭头指Kernel: arch/arm/boot/uImage is ready收官行。两个字节数已记账实验二十三点火时与 tftp 的Bytes transferred对账。步骤 3放入 FS-MP1A 的设备树源文件Slide 435.4.31 内核必须配设备树才能跑。ST 官方板的设备树是arch/arm/boot/dts/下的stm32mp15xx-dkx.dtsistm32mp157a-dk1.dts前者也是 0020-DEVICETREE 补丁新建的实验十九说过FS-MP1A 的对应文件老师已提供就是资料包kernel-初始设备树.zip。zip 的结构先看清解压出来不是一个光秃秃的文件而是套了一层kernel-初始设备树/目录两个文件在目录里——直接cp zip 里的文件会扑空。zip 里的文件在kernel-初始设备树/一层目录下放到内核源码的位置角色stm32mp15xx-fsmp1x.dtsi3,662 字节177 行arch/arm/boot/dts/FS-MP1A 的公共外设描述实验二十一、二十二往它里面加 eMMC 与网卡的节点stm32mp157a-fsmp1a.dts724 字节35 行arch/arm/boot/dts/板级入口文件引用 .dtsi复制与验证按先去到目的地 → 再执行复制 → 再检验三步走——命令里的共享目录是占位符换成你在虚拟机里放资料包解压内容与工作文件的那个目录本系列示例~/Desktop/LINUX-gy/Test2每个人的前缀不同它后面的长串stm32mp1-openstlinux-…起出自同一个资料包人人一样、照抄即可① 去到设备树目标目录cd共享目录/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/linux-5.4.31/arch/arm/boot/dts/pwdpwd打出的路径末段应是dts——到了。后面的复制、检验都在这里执行刚才两个报错——“为同一文件与没有那个文件或目录”——都是没先到这里造成的人在解压目录里cp的相对目标落空、ls的相对目标也不存在。② 执行复制源用完整路径指向右键提取出的目录目标. 当前 dts 目录cp共享目录/kernel-初始设备树/stm32mp15xx-fsmp1x.dtsi.cp共享目录/kernel-初始设备树/stm32mp157a-fsmp1a.dts.若你的提取目录名/位置与示例不同把源路径前半段换成你的实际位置。cp成功时一声不吭——没有输出就是成功成败看下一步的检验。右键提取出的kernel-初始设备树/目录完成复制后可留可删。③ 检验就在 dts 目录里用相对路径——人已站在正确的一层验的就是真货ls-lstm32mp15xx-fsmp1x.dtsi stm32mp157a-fsmp1a.dtslsstm32mp157.dtsi stm32mp15xa.dtsi stm32mp15-pinctrl.dtsi stm32mp15xxaa-pinctrl.dtsi第一条应打出 3,662 / 724 两个文件——复制成功的凭据这条检验只有站在内核树的 dts 目录里才会真正通过上一版人在解压目录里验恰好有同名文件会假通过这就是流程改成先到目的地再复制再检验的原因。第二条四个新命名文件是 0020-DEVICETREE 补丁带进来的实验十九步骤 3.2 说过四个都在 补丁打全了。就地验证两条ls-lstm32mp15xx-fsmp1x.dtsi stm32mp157a-fsmp1a.dts# 两个新文件都在lsstm32mp157.dtsi stm32mp15xa.dtsi stm32mp15-pinctrl.dtsi stm32mp15xxaa-pinctrl.dtsi# 这四个新命名文件是 0020-DEVICETREE 补丁带进来的实验十九步骤 3.2 说过# 四个都在 补丁打全了我们文件的 include 才接得上缺了就回实验十九重打文件内容现在不用看懂但三个彩蛋先埋好① 它里头已经写好了v3v3、vdd两路固定电源后面实验二十一的 eMMC 节点直接引用② 它的sdmmc1SD 卡节点里cd-gpios用的正是gpioh 3——第 3 章 F-2 在 U-Boot 里手工做的那个改动PB7→PH3内核侧老师给的文件原生就是这么写的同一块板、两个 bootloader 各自印证③ 它把看门狗iwdg2设成 32 秒超时并使能——实验十六 panic 后约半分钟自动复位的幕后主使源码出处就在这儿。实验二十一、二十三会分别再碰到它们。图实测——步骤 3 全程重复执行一次cd无害原地踏步两条cp无声成功ls -l打出724 / 3,662 字节两个文件时间戳 21:27/21:28 刚复制进来的ls四个新命名文件stm32mp157.dtsi、stm32mp15-pinctrl.dtsi、stm32mp15xa.dtsi、stm32mp15xxaa-pinctrl.dtsi 全部在列——0020-DEVICETREE 补丁打全的凭据我们两个文件的#include有着落了。顺手查一下顶层的残留此前若曾在内核顶层错放过这两个文件上一轮cp ... .版按步骤 4 开头的cd回到内核顶层后执行git status --short——若见?? stm32mp15xx-fsmp1x.dtsi、?? stm32mp157a-fsmp1a.dts两行残留rm掉它们dts 目录里已是新副本没有就跳过本条。步骤 4让 dts/Makefile 认识新设备树Slide 44人在 dts 子目录下面 grep/nano 用相对路径前先回内核顶层cd 共享目录/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/linux-5.4.31。设备树不会自动被编译——要在arch/arm/boot/dts/Makefile的 STM32 那一组里加一行。定位grep-nCONFIG_ARCH_STM32arch/arm/boot/dts/Makefile# 第 981 行起是它的 dtb 清单打开 dts/Makefilenanoarch/arm/boot/dts/MakefileCtrlW搜stm32mp157a-dk1.dtb回车光标直落第 991 行在该行行尾回车新起一行插入一行stm32mp157a-fsmp1a.dtb \图实测顶替课件 Slide 44——nano 4.8 里改好的样子绿框即新增的stm32mp157a-fsmp1a.dtb \插在stm32mp157a-dk1.dtb \之后、stm32mp157d-dk1.dtb \之前dtb-$(CONFIG_ARCH_STM32) 清单里绿箭头指向它底部已写入 1323 行 保存成功。行尾的反斜杠\是续行符一个都不能少——它告诉 make清单还没列完。就地验证grep-nfsmp1a.dtbarch/arm/boot/dts/Makefile# 应恰有一行dtb 清单里那条加行之前跑这条必然无输出——那行还没加呢不是坏了nano 加完再跑才会打出恰一条。步骤 5编设备树——make dtbsSlide 45makedtbs# 步骤 4 开头已回到内核顶层直接敲make dtbs只编设备树、不重编内核几秒钟完事编.dtb用的dtc就是实验十九 apt 装 u-boot-tools 时捎带上的device-tree-compiler。以后每次改.dtsi都只用敲它——实验二十一、二十二全是这个节奏。编完验证ls-larch/arm/boot/dts/stm32mp157a-fsmp1a.dtb# 几万字节量级出厂的 mipi050.dtb 是 71,805 字节我们这份因源文件不同数值会不同# 字节数记下来实验二十三对账用实际执行结果2026-09-26 实测图实测——make dtbs首次运行会把清单里所有板子的 dtb 都编一遍满屏 DTC 行正常不是失控绿箭头指收官对账行ls -l打出arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb——63,250 字节出厂的 mipi050.dtb 是 71,805源文件不同数值不同属预期。字节数已记账实验二十三点火时与 tftp 的Bytes transferred对账。步骤 6认知——此刻点火会发生什么Slide 45~46本篇不动板子但要把零修改内核点火的预期算清楚实验二十三全靠它对照。课件 Slide 45~46 给的预告是缺 eMMC 驱动内核启动会一直停在图课件 Slide 46——内核启动日志的结尾驱动探完一轮后最后一行停在Waiting for root device /dev/mmcblk1p4...。注意两点① 课件板的 eMMC 盘号是mmcblk1与我们板无必然对应盘号怎么定看实验二十三② 这屏日志里Kernel command line带了root...——那是课件板 U-Boot 环境里留着的 bootargs 传进去的不是内核自带的默认值。课件说缺 eMMC 驱动这话对了一半——源码层面看得更细实验十九打完补丁的这棵树里可以验证控制器驱动其实已经在menuconfig 里的STMicroelectronics STM32 SDMMC Controller配置符号CONFIG_MMC_STM32_SDMMC依赖 ARM AMBA MMC 且default y——实验十九生成的.config里它天生就是y。实验二十一还会让你开 menuconfig 看一眼到时它已经是勾上的真正缺的是设备树节点SoC 级stm32mp151.dtsi里sdmmc2eMMC 那条总线默认status disabled老师给的fsmp1x.dtsi又没写它的板级节点——设备树不描述驱动再全也没人去接管。SD 卡那条总线sdmmc1在fsmp1x.dtsi里节点齐全所以零修改内核认得出 SD 卡、认不出 eMMC——一出一入正好是实验二十一要补的对照。再挂上我们的环境差异课件板的 U-Boot 环境里留着出厂 bootargsroot/dev/mmcblk1p4所以它等根设备我们的板从实验九清过环境、bootargs 从没设过——同样点火会走实验十六的老结局Kernel command line:为空 → 直接Kernel panic - not syncing: VFS: Unable to mount root fs。等还是 panic差别只在 bootargseMMC 认不出来这件事两边是一样的。步骤 7把实验二十的改动提交进 git选做推荐第 3 章的分层管理实验二讲的官方底座 / ST 补丁 / 自己的修改三层在内核树同样适用实验十九提交了基线new kernel实验二十的改动值得单独一条提交——出问题时git log/git diff能立刻分清是哪一层干的而且提交之后内核版本串的-dirty尾巴会消失实验十九步骤 3.3 的机制实验二十一、二十二再改时哪次改的在版本串上一目了然。提交前先看一眼工作区2026-09-26 实测与你的终端应一致gitstatus--shortM Makefile M arch/arm/boot/dts/Makefile ?? arch/arm/boot/dts/stm32mp157a-fsmp1a.dts ?? arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi ?? arch/arm/configs/stm32_fsmp1a_defconfig五个文件正是步骤 1~5 的全部改动顶层没有多余残留——之前错放的两个 dts 文件已清理.config被 .gitignore 忽略不入列。显式列出文件提交不用git add -A第 3 章实验十一的教训add -A 容易把不该入库的文件卷进来gitaddMakefile arch/arm/boot/dts/Makefile arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi arch/arm/boot/dts/stm32mp157a-fsmp1a.dts arch/arm/configs/stm32_fsmp1a_defconfiggitcommit-mFS-MP1A 设备树与编译配置实验二十就地验证gitlog--oneline|head-3# 顶部应是FS-MP1A 设备树与编译配置实验二十gitstatus--short# 应无输出 工作区干净提交后的两个小变化① 版本串从Linux-5.4.31-g77fcad789-dirty变成Linux-5.4.31-g新哈希-dirty消失——工作区干净了② 想让账本跟着更新顺手增量重编一次make uImage dtbs LOADADDR0xC2000040几分钟版本串写进镜像会导致字节数微调——实验二十三对账以最新一次的字节数为准。实验二十一的改动不单独提交——它与实验二十二同改一个fsmp1x.dtsi、同属第 5 章驱动移植一组两篇一起在实验二十二收官时提交一条说明与命令见实验二十二。实际执行结果2026-09-26 实测图实测——提交全程git add五个文件后git status --short显示M M A A A两个修改 三个新增全部已暂存git commit打出[WORKING 381ee3922] FS-MP1A 设备树与编译配置实验二十、5 files changed, 6542 insertions()defconfig 一千六百行是大头create mode ×3 两个 dts 文件与 defconfig 首次入库git log --oneline顶部两条 实验二十提交叠在实验十九的new kernel基线之上收尾git status --short无输出 工作区干净版本串的-dirty尾巴已随之消失下次重编生效。五、注意事项第一次make uImage时间长是正常的20~40 分钟量级中途 CtrlC 也没关系重敲会从断点续编make 的增量特性第 3 章编 U-Boot 时验证过。编译里打出Killed是 4GB 虚拟机内存不够OOM换-j2接着编。LOADADDR 别写成 0xC2000000差 0x40 就是差一个头。它在头里的Load Address/Entry Point两栏出现——实验十六 bootm 回显里见过。stm32mp157a-fsmp1a.dtb与出厂的stm32mp157a-fsmp1a-mipi050.dtb是两份不同的 dtb前者是我们源码里编的后面两篇持续改它model字段是HQYJ STM32MP157 FSMP1A Discovery Board不带 MIPI后者是华清出厂 bootfs 里的...FSMP1A MIPI...。实验二十三点火用我们自己这份别拿错。dts/Makefile 加行注意续行符\加错位置或漏\make dtbs不会编出我们的 dtb且不报错——grep fsmp1a.dtb与ls产物是唯一判据。改 Makefile 前后用git diff过一眼源码已纳管改坏了好回退。编译报arm-none-linux-gnueabihf-gcc: command not found→ 回实验十九步骤 1PATH/重新登录。在共享文件夹里编译能跑但慢实验十九已实测解压/打补丁无碍吃 IO 的是 make——慢到不能忍或报符号链接/权限类错误时把源码挪到虚拟机本地磁盘如~/kernel/挪后要make distclean 用stm32_fsmp1a_defconfig重做配置再回到本篇步骤 1。六、验证点一览这一节把各步骤里就地该敲的验证汇总成表方便对照自查每条的判据都写在对应步骤里验证点命令通过的样子在哪一步敲顶层 Makefile 两行grep -n ^ARCH : arm Makefile、grep -n ^CROSS_COMPILE : arm-none Makefile两行各打出一条步骤 1uImage 生成ls -l arch/arm/boot/uImage实测 7,313,872 字节2026-09-26字节数记下与实验二十三对账步骤 2四兄弟账目ls -l arch/arm/boot/uImage arch/arm/boot/zImage实测恰差 64 字节7,313,872 − 7,313,808步骤 2设备树源文件到位ls -l stm32mp15xx-fsmp1x.dtsi stm32mp157a-fsmp1a.dtsdts 目录里实测通过2026-09-26724 / 3,662 字节两个文件在 dts 目录步骤 3补丁带来的依赖齐全ls stm32mp157.dtsi stm32mp15xa.dtsi stm32mp15-pinctrl.dtsi stm32mp15xxaa-pinctrl.dtsi实测四个全在0020 补丁的货步骤 3dts/Makefile 加行grep -n fsmp1a.dtb arch/arm/boot/dts/Makefile实测恰一条行尾带\加行前跑必无输出属正常步骤 4dtb 生成ls -l arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb实测 63,250 字节2026-09-26字节数记下与实验二十三对账步骤 5工作区改动清白git status --short只有预期项顶层 Makefile、dts/Makefile、两个新 dts 文件.config等忽略项之外无意外文件收尾git 收官提交git log --oneline | head -3、git status --short实测通过2026-09-26提交哈希381ee3922在列、工作区干净步骤 7不达标时的排查现象先查什么make uImage报mkimage command not found实验十九步骤 2 的 u-boot-tools 装了没mkimage -V编译一开始就报架构/编译器相关错误顶层 Makefile 两行的拼写arm-none-linux-gnueabihf-gcc单独敲一下make dtbs报找不到stm32mp157.dtsi等 include0020-DEVICETREE 补丁没打全实验十九步骤 3.2——ls …/*.patchmake dtbs后找不到我们的 dtbdts/Makefile 那行的位置与行尾\grep fsmp1a.dtb核对编译中途Killed4GB 内存 OOM——换-j2续编磁盘满清理或扩容源码 编译产物约 2~3 GB七、实验完成标志顶层 Makefile 已加ARCH/CROSS_COMPILE两行grep两条都能打出步骤 1 实测nano 截图入档make uImage LOADADDR0xC2000040编译成功2026-09-26 实测arch/arm/boot/uImage生成7,313,872 字节、zImage 7,313,808 恰小 64 字节、版本串Linux-5.4.31-g77fcad789-dirty、Load Address/Entry Point均为c2000040步骤 2 实测截图入档stm32mp15xx-fsmp1x.dtsi3,662 字节与stm32mp157a-fsmp1a.dts724 字节已放入arch/arm/boot/dts/四个新命名依赖文件都在步骤 3 实测截图入档dts/Makefile 已加stm32mp157a-fsmp1a.dtb \一行grep恰一条步骤 4 实测截图入档make dtbs编出arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb实测 63,250 字节2026-09-26步骤 5 实测截图入档git status --short只显示预期改动步骤 1~4 的四个文件步骤 7 实测实验二十改动已单独提交哈希381ee3922、5 files changed 6542 insertions工作区干净实验二十一的改动按约定不单独提交见步骤 7 尾八、下一步移植 eMMC 驱动内核编出来了但它看不见eMMC——缺的是设备树里的 sdmmc2 节点。下一篇实验二十一补上它往fsmp1x.dtsi加一段节点 开 menuconfig 确认那个天生已开的控制器选项 重编译让内核像出厂那份一样把 eMMC 认出来。