第一章 嵌入式Linux内核移植概述
大家好,我是你们的嵌入式Linux内核移植讲师。在正式开始之前,我想先聊聊我自己的经历。十年前我刚入行时,接手第一个项目就是给一块陌生的开发板移植Linux内核。那时候资料少,论坛上问问题都没人理。我花了整整两周才把系统跑起来,中间踩过的坑现在想起来还心有余悸。所以这门课,我希望能帮你少走弯路。
好,咱们直接进入正题。
1.1 什么是内核移植
说白了,内核移植就是让Linux内核能在你手头这块特定的硬件上跑起来。你想想看,Linux内核最初是为x86架构的PC设计的。但嵌入式世界五花八门——ARM、RISC-V、MIPS,各种架构都有。就算都是ARM,不同厂商的SoC外设也不一样。比如STM32MP157和i.MX6ULL,它们的内存控制器、中断控制器、时钟树完全不同。
所以内核移植要干的事,就是告诉内核:
- 你的CPU是什么架构(ARMv7?Cortex-A7?)
- 内存布局是怎样的(DDR起始地址、大小)
- 外设怎么访问(UART、GPIO、I2C的寄存器地址)
- 时钟怎么配置(PLL分频、倍频参数)
这些信息都写在设备树(Device Tree)和板级支持包(BSP)里。我习惯把内核移植比作「给操作系统配钥匙」——每块板子都是不同的锁,你得配一把专属的钥匙才能打开它。
核心观点:内核移植不是重写内核,而是配置和适配。90%的工作量在设备树和驱动上,内核核心代码基本不动。
1.2 为什么需要移植
这个问题我经常被问到。有人觉得:「官方内核不是支持很多板子吗?直接用不就行了?」
嗯,这里要注意。官方主线内核确实支持一些开发板,比如树莓派、BeagleBone。但咱们做产品开发,很少直接用公板。原因有三:
- 硬件定制化——产品硬件会改,比如换一颗DDR颗粒、加一个传感器。这些改动都需要内核适配。
- 性能优化——通用内核为了兼容性,很多配置是保守的。比如缓存策略、调度器参数,针对你的硬件调优后性能能提升20%以上。我在项目中遇到过,同样的i.MX6ULL平台,优化前后视频解码帧率从15fps涨到22fps。
- 外设驱动缺失——很多国产芯片、小众外设,主线内核根本没有驱动。你得自己写或者移植。
我的建议:不要盲目追求最新内核版本。稳定、有社区支持、有现成BSP的版本才是首选。比如5.10 LTS版本,很多厂商都在用,资料丰富。
1.3 主流开发板介绍
咱们课程会重点讲三块板子。为什么选它们?因为这三块板子代表了嵌入式Linux的三个典型档次。
| 开发板 | SoC厂商 | CPU架构 | 典型应用 | 内核版本建议 |
|---|---|---|---|---|
| STM32MP157 | ST | 双核Cortex-A7 + M4 | 工业控制、HMI | 5.10 / 6.1 LTS |
| i.MX6ULL | NXP | 单核Cortex-A7 | 物联网网关、边缘计算 | 4.19 / 5.4 |
| RK3568 | Rockchip | 四核Cortex-A55 | 智能平板、NAS、AI盒子 | 5.10 / 6.1 |
STM32MP157——ST家的明星产品。它有个特点:异构双核。一个Cortex-A7跑Linux,一个Cortex-M4跑裸机或RTOS。我在做工业HMI项目时用过它,A7负责界面和网络,M4负责实时控制,分工明确。移植难点在于双核通信和电源管理。
i.MX6ULL——NXP的经典入门级。单核A7,主频只有800MHz,但胜在稳定、资料全、成本低。很多物联网网关都用它。移植起来相对简单,适合新手入门。我记得第一次成功点亮它的LED时,那种成就感至今难忘。
RK3568——瑞芯微的中高端芯片。四核A55,带GPU和NPU,性能强劲。适合跑Android或带图形界面的Linux。移植难点在于GPU驱动和多媒体框架。我去年帮客户调过RK3568的VPU解码,折腾了整整一周才搞定。
避坑指南:我曾经在RK3568上吃过亏——官方SDK里内核版本是4.19,但主线已经到6.1了。我直接切到主线,结果发现GPU驱动不兼容,回退又花了三天。所以我的建议是:先用厂商提供的BSP版本跑通,再考虑升级主线。
1.4 内核源码获取与版本选择
源码去哪搞?我一般用这几个渠道:
- kernel.org——官方主线,最纯净,但硬件支持少。
- 厂商GitHub/Gitee——比如ST的github.com/STMicroelectronics、NXP的github.com/nxp-imx。这些仓库里已经有板级支持补丁。
- Buildroot/Yocto——它们会自动下载并打补丁,适合做产品。
版本选择上,我有个「三看原则」:
- 看LTS——长期支持版本,比如5.10、6.1。社区会维护好几年,bug修复及时。
- 看厂商支持——厂商的BSP基于哪个版本,你就用哪个。比如ST的STM32MP1系列官方推荐5.10。
- 看社区活跃度——去邮件列表看看,最近讨论多不多。太老的版本(比如3.x)就别碰了。
我的习惯:下载源码后第一件事不是编译,而是看arch/arm/boot/dts/目录下有没有对应板子的设备树文件。如果有,说明官方已经支持了,移植工作会轻松很多。
举个例子,下载5.10内核后:
# 查看STM32MP157的设备树
ls arch/arm/boot/dts/stm32mp157*.dts
# 查看i.MX6ULL的设备树
ls arch/arm/boot/dts/imx6ull*.dts
# 查看RK3568的设备树(注意它在arm64目录下)
ls arch/arm64/boot/dts/rockchip/rk3568*.dts
如果找不到对应文件,那就得自己写了。别怕,后面章节我会手把手教你。
本章知识体系
为了让你更直观地理解本章内容,我画了一张图。它展示了内核移植的核心逻辑和知识脉络。
这张图把本章的核心内容串起来了。你看,内核移植不是孤立的技术,它涉及硬件理解、源码管理、版本策略等多个维度。后面每一章,我都会围绕这些点展开。
好,第一章就到这里。记住:移植的本质是适配,不是重写。选对版本、看懂硬件、用好设备树,你就成功了一半。
公众号:蓝海资料掘金营,微信deep3321