19_实验十八_认识Linux内核

📅 发布时间:2026/10/3 7:35:09
19_实验十八_认识Linux内核
实验十八 认识 Linux 内核——版本号、源码目录与内核文件四兄弟对应课件《第5章 移植Linux内核》5.1~5.3 节Slide 2-24系列说明本系列基于华清远见 FS-MP1ASTM32MP157A开发板对应课件《第5章 移植Linux内核》。第 4 章我们用出厂内核uImage 7,546,640 字节 stm32mp157a-fsmp1a-mipi050.dtb把 Linux 点着了但它是别人编好的——第 5 章要做的是自己动手把它编出来、移植出来装交叉编译器、拿 ST 源码打补丁、配菜单、改设备树、补驱动最后用bootm点火验证。本篇是第 5 章开篇的认知篇内核版本号怎么读、源码目录长什么样、vmlinux/Image/zImage/uImage四个文件什么关系——这些概念不先立住后面每一步命令都会变成照抄天书。前置第 4 章实验十六~十七亲手点火过出厂内核本篇所有概念都挂在那次经历上。一、先把两组名词对齐内核kernel与根文件系统rootfs是两码事内核负责驱动硬件、调度进程它自己不提供ls、ping这些命令——那些属于根文件系统。实验十六点火后停在Kernel panic - not syncing: VFS: Unable to mount root fs正是内核起来了、但没找到根文件系统两样东西缺一不可。第 5 章解决内核侧自己编内核 自己的设备树 补驱动根文件系统是第 6 章的事——本篇先在心里把这条边界划清后面看到root字样就知道那是第 6 章的活。设备树.dtb是内核的硬件说明书同一份内核镜像喂给它 DK1 的 dtb 就按 DK1 的硬件跑喂给我们板的 dtb 就按我们的板跑实验十六Machine model:一行就是证据。第 5 章要加的 eMMC 节点、网卡节点改的都是设备树源文件——它们决定内核看得见哪些硬件配合.config决定驱动编译了没有两者缺一硬件就不通。二、版本号四个字段读一遍就懂Linux 内核版本写在源码顶层目录的Makefile文件开头四个字段字段含义出厂内核我们板上那份的值VERSION主版本号5PATCHLEVEL次版本号4SUBLEVEL修改次数安全补丁、bug 修复时递增31EXTRAVERSION附加串通常为空-rc6这类是开发预览版空拼起来就是5.4.31——实验十六点火时 U-Boot 报的Image Name: Linux-5.4.31、内核日志第一屏的Linux version 5.4.31 (oe-useroe-host)...说的都是它。图课件 Slide 2——内核源码顶层 Makefile 中的版本号定义VERSION 5、PATCHLEVEL 4、SUBLEVEL 31、EXTRAVERSION为空。实验十九解压源码后我们会真的打开自己这份 Makefile实验二十还会往里加两行到时候回来看这张图。为什么直接从 4.x 跳到了 5.0Linus 本人在 5.0 的发布公告邮件里说了实话——数字大到手指脚趾加起来不够数了没有别的含义图课件 Slide 3——Linus Torvalds 发布 5.0 的公告邮件片段英文“…that “5.0” doesn’t mean anything more than that the 4.x numbers started getting big enough that I ran out of fingers and toes.”——版本号只是数字变大不是按功能划分的这句原文值得留个印象以后看到 6.x、7.x 也不用大惊小怪。两个延伸知识点4.0 版本之前PATCHLEVEL奇数是开发版、偶数是稳定版现在已经不区分奇偶。PATCHLEVEL递增到 19~20 左右就进位VERSION 1SUBLEVEL只在安全补丁、bug 修复时递增。简明版本史课件 Slide 4~51991 年 0.01 起家 → 1994 年 1.0 官方版仅 386→ 1995 年 1.2 首个多平台版 → 1996 年 2.0 首个 SMP多核版 → 2003 年 2.6 大改版新调度器、可抢占、支持无 MMU 处理器→ 课件成稿时的最新稳定版是 6.4.52023 年 7 月。我们手里的 5.4.31 是 5.4 LTS长期支持线上的一个点ST 为 STM32MP1 维护它。源码从官网www.kernel.org获取图课件 Slide 6~9——kernel.org 首页HTTP/FTP/RSYNC 三种下载方式版本按mainline主线开发/ stable稳定版/ longterm长期支持版/ linux-next前瞻集成四条线列出截图是课件制作时的 3.x 时代页面。但我们不用去官网下ST 把 5.4.31 官方源码连同它家的补丁一起打包放在了课程资料里en.SOURCES-*.tar.xz已复制到本目录实验十九直接解压它——这也是 embedded 圈的常态芯片厂商基于 LTS 内核加自家补丁再发布很少有人裸用 kernel.org 的源码。三、源码目录60K 个文件先认顶层5.4.31 版内核有 60K 个文件、2.5M 行代码但顶层目录是有章法的图课件 Slide 10——5.4.31 版内核源码顶层目录含编译生成文件arch、block、certs、crypto、Documentation、drivers、fs、include、init、ipc、kernel、lib、mm、net、samples、scripts、security、sound、tools、usr、virt等目录以及.config、Makefile、vmlinux、System.map等文件。实验十九解压完源码后自己的目录长的一模一样——到时候ls一下逐个对号。每类目录管一摊课件 Slide 11~12 两张表逐个点名图课件 Slide 11——顶层目录说明表前半arch架构相关、block块设备、crypto加密、Documentation文档、drivers驱动、fs文件系统、include头文件、init初始化、ipc进程间通信、kernel内核核心、lib库、LICENSES许可、mm内存管理、net网络、samples例程、scripts脚本、security安全、sound音频均为 Linux 自带。图课件 Slide 12——顶层目录说明表后半tools、usrinitramfs、virtKVM 虚拟化文件类.config编译生成的配置文件内核最终按它决定编译什么、Kbuild/Kconfig配置体系、Makefile顶层构建脚本、README官方编译说明、System.map符号表、vmlinux编译生成。表里还列了stm32mp157d_atk.sh——那是正点原子给它们板子写的编译脚本我们不用它。第 5 章实验只会碰到其中五个现在先记住它们的位置目录/文件管什么第 5 章哪一步碰arch/arm/32 位 ARM 架构全部相关代码引导、系统调用、主频设置等头号常客arch/arm/configs/各开发板的默认配置文件xxx_defconfig实验十九加载multi_v7_defconfig并把我们自己的配置存成stm32_fsmp1a_defconfig存在这里arch/arm/boot/编译生成的uImage/zImage/Image实验二十编完内核来取货arch/arm/boot/dts/设备树源文件.dts/.dtsi与编译产物.dtb实验二十~二十二放入 fsmp1a 设备树、改三处drivers/net/phy/以太网 PHY 驱动实验二十二放 MAE0621A 网卡驱动arch/arm里面长这样图课件 Slide 14——arch/arm目录截图boot、common、configs、crypto、include、kernel、kvm、lib子目录加几十个mach-xxx平台目录mach-stm32就是 STM32 系列的驱动与初始化文件所在。configs里躺着各板子的默认配置图课件 Slide 15——arch/arm/configs目录截图各平台xxx_defconfig。其中multi_v7_defconfig是 fsmp1a 参考的配置实验十九会加载它我们自己生成的stm32_fsmp1a_defconfig以后也存在这个目录。再看一眼内核的构建体系课件 5.3实验十九动手时逐个对号内核不是靠一个 Makefile 编出来的而是五类 Makefile 分工协作——图课件 Slide 19——Linux 内核 Makefile 分类表顶层 Makefile核心总体控制、.config配置文件所有 Makefile 都按它决定编什么、arch/$(ARCH)/Makefile架构相关、scripts/Makefile.*通用规则与脚本、kbuild Makefiles各级子目录自己的 Makefile被上层调用。详细说明在Documentation/kbuild/makefiles.txt。合起来的工作方式.config定义变量 → 各级 Makefile 按变量决定哪些文件编进内核y、编成模块m或跳过 → 顶层 Makefile 按arch/arm/kernel/vmlinux.lds链接脚本组织生成vmlinux。实验十九的make ARCHarm multi_v7_defconfig干的就是生成 .config这一步实验二十的make uImage就是让这条流水线跑到头。四、内核文件四兄弟vmlinux → Image → zImage → uImage这一节直接挂在我们实验十六的经历上。内核编出来是一条加工链文件是什么与实验十六的账vmlinux编译得到的最原始内核文件ELF 格式、未压缩——Imagevmlinux去掉 ELF 信息转成纯二进制bin仍未压缩——zImageImage压缩后得到——uImageU-Boot 专用在 zImage 基础上加64 字节0x40文件头实验十六实测对上了tftp 下载 7,546,640 字节bootm 报Data Size: 7546576——少的 64 字节就是头Load Address: c2000040 0xC2000000 0x40 也是这个头让出来的记住这条链实验二十编内核时make uImage这一条命令就会把这四级全部走完而LOADADDR0xC2000040这个参数为什么是这个值等的就是实验十六那次实测的解释——uImage 放在 0xC2000000头占 0x40真身从 0xC2000040 开始。五、内核配置.config、menuconfig 与三种状态内核功能上千项全部状态记录在源码顶层的.config文件里隐藏文件配置工具自动生成不要手改。配置工具有图形界面在内核顶层目录执行make menuconfig图课件 Slide 23——make menuconfig启动的配置工具界面方向键移动、Enter进子菜单、Y/N/M三键选状态、连按EscEsc退出、/键搜索。主菜单从Code maturity level options到Library routines共十几项。实验十九、二十一、二十二都会打开它到时候标题栏会显示 Linux/arm 5.4.31 Kernel Configuration。每个选项有三种状态.config里长这样图课件 Slide 20——.config的块设备片段编进内核CONFIG_BLK_DEV_LOOPy、编成模块CONFIG_BLK_DEV_NBDm、不使用# CONFIG_BLK_DEV_COW_COMMON is not set。三种写法一一对应 menuconfig 里的[*]/M/[ ]。menuconfig 里的具体长相图课件 Slide 24——选项示例 未使用、*编进内核、[*]编进内核无模块形态、[ ]未选中。图课件 Slide 24——需要赋值的选项十六进制数(0x0) Compressed ROM boot loader base address、字符串(root/dev/hda1 ro init/bin/bash consolettySAC0) Default kernel command string。注意这个字符串就是内核的默认命令行CONFIG_CMDLINE——实验十六我们看到的Kernel command line:是空的空的就是它第 5 章实验二十三设bootargs环境变量传的就是这一类内容。上千项逐项配是不现实的通常做法是拿一份现成的、硬件相近的 defconfig 打底再改——我们用的就是 ST 官方适配好的multi_v7_defconfig实验十九落地叠 ST 的 fragment 碎片配置。六、实验环境实际项目实际值板子状态第 4 章收官形态trusted U-Boot bootcmd网络三连 mybootnet/mybootemmc两条自定义变量实验十七Ubuntu 虚拟机工具链 ST SDK 已装实验一arm-ostl-linux-gnueabi-本篇不动它本篇新增材料无——本篇是认知篇不敲板子命令、不编译开工自检10 秒本篇不上板。板子可以不开虚拟机也不用开要做的只是把第 5 章的概念与我们已跑过的经历对上号。七、课件 ↔ 步骤对应表课件 Slide内容对应本篇2~95.1 版本号四字段、Linus 邮件、kernel.org第二节10~185.2 源码顶层目录、arch/arm、.config/Makefile第三节19~215.3 内核 Makefile 体系第三节的延伸实验十九动手时再对号22内核文件四兄弟 vmlinux/Image/zImage/uImage第四节23~24menuconfig 与三种配置状态第五节25拿相近板子的 defconfig 打底的通常做法第五节末本篇概念 → 后面谁用 → 现在含糊的后果本篇概念后面哪一篇用现在含糊的后果版本号四字段5.4.31实验十九解压源码后核对Makefile实验二十编出的uImage版本串里带它拿错源码包都不知道arch/arm/configs/与xxx_defconfig实验十九加载multi_v7_defconfig并存档stm32_fsmp1a_defconfigdefconfig 与.config的关系搞反配置改了不生效uImage 比 zImage 多 0x40 头实验二十make uImage LOADADDR0xC2000040的0xC2000040就是0xC2000000 头也解释实验十六Data Size与 tftp 字节数差的 64LOADADDR 随手写成 0xC2000000内核搬错位置起不来menuconfig 三种状态与.config实验十九合并 fragment、实验二十一确认 SDMMC、实验二十二勾 MAXIO PHY勾了选项但没保存、或直接手改.config改动丢失/打架内核 vs 根文件系统的边界实验二十三借出厂根点火、第 6 章全部以为编出内核就能进命令行panic 时不知道缺的是哪半边本篇不需要任何新资料——全部是概念对齐。第 5 章真正要用的三个文件en.SOURCES-*.tar.xz139,946,924 字节、kernel-初始设备树.zip2,226 字节、kernel-网卡驱动.zip18,708 字节已复制到本目录实验十九起逐个登场md5 见实验十九素材与出处。八、自测一览本篇是认知篇无板子操作。对照下表逐条自问自答答不上来的回到对应小节重读自测问题达标答案在哪一节拿到一份内核源码去哪里看版本号顶层Makefile的VERSION/PATCHLEVEL/SUBLEVEL/EXTRAVERSION四个字段第二节从 4.x 直接跳到 5.0 有什么特殊含义没有——Linus 原话手指脚趾不够数了第二节内核 60K 个文件第 5 章常打交道的是哪五个位置arch/arm/、arch/arm/configs/、arch/arm/boot/、arch/arm/boot/dts/、drivers/net/phy/第三节zImage与uImage差在哪uImage zImage 64 字节 U-Boot 头所以实验十六里 tftp 的 7,546,640 与 bootm 的Data Size: 7546576差 64第四节menuconfig 里[*]、M、[ ]分别对应.config里的什么y编进内核、m编成模块、is not set不使用第五节自己编出内核之后还差什么才能进命令行根文件系统——实验十六的 VFS panic 就是它缺席第 6 章解决第一节九、下一步内核源码准备与配置下一篇实验十九进入动手篇装 ARM 官方交叉编译器gcc-arm-9.2为什么不用第 3 章的 SDK 编译器它编 busybox 会缺库、装u-boot-tools没有mkimage编 uImage 会报错、解压 ST 源码并打补丁、合并 fragment 配置——把能编内核的地基打好。