Linux 移植技术详解:从源码到运行的完整工程路径

一、什么是 Linux 移植?为什么要做?

**Linux 移植(Porting Linux)**指的是将 Linux 内核、设备树、驱动及文件系统,适配到特定的硬件平台(如 STM32MP1、i.MX6、瑞芯微、Allwinner、RISC-V SoC)上运行。

为什么需要移植?

一句话总结: 移植让 Linux 真正运行在你控制的硬件上,而不是开发板厂商预装的“系统镜像”。


二、移植的核心组件有哪些?

Linux 系统从引导到运行,主要涉及以下五大核心部分:

组件
功能
是否必须
是否定制
Bootloader(如 U-Boot)
加载内核,初始化硬件
Linux Kernel
核心功能,调度、驱动
Device Tree(设备树 DTS)
描述硬件结构
Root Filesystem
系统根目录,提供用户空间
Toolchain(交叉编译器)
构建内核和应用
一次配置

如果将 Linux 移植比喻为造一辆车:


三、完整移植流程:从源码到可运行系统

第一步:准备交叉编译环境

    

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-


第二步:获取并配置 U-Boot

    

git clone
cd u-boot
make
make

定制支持的串口、Flash 驱动、启动方式(如 SD 卡、SPI-NAND)


第三步:获取并裁剪 Linux 内核

    

git clone
cd linux
make
make zImage dtbs modules

注意:


第四步:定制 Device Tree(设备树)

设备树描述了 CPU、内存、串口、GPIO、外设等硬件资源。移植时应重点修改:

    

&uart0 {
status = "okay";
};

&spi1 {
status = "okay";
flash@0 {
compatible = "winbond,w25q128";
...
};
};


第五步:构建 Root FileSystem

可选方式:

  1. 使用 Buildroot (推荐,自动打包)

  2. 使用 Busybox + 自建目录结构

  3. 使用 Yocto(适合商业项目)

关键目录说明:

路径
说明
/bin
, /sbin , /usr
命令执行目录
/etc/inittab
系统启动脚本定义
/dev
, /proc , /sys
虚拟文件系统挂载点
/etc/init.d/
启动服务脚本
/lib
动态库存放

确保 init 系统正常:

/etc/inittab:
::sysinit:/etc/init.d/rcS


第六步:烧写与启动

将以下文件烧录到开发板:

烧写方式:


四、常见错误与调试方法

现象
原因分析
排查建议
卡在 U-Boot
配置不当 / 串口不通
检查串口引脚、电压、U-Boot config
Kernel panic
驱动缺失 / 内核启动参数错误
查看启动 log(earlyprintk)
RootFS 挂载失败
文件系统格式不兼容
使用 ext4,确认 init 存在
设备树无效
没有加载正确 DTS
确保 bootargs 指向正确 DTB
无法进入 shell
没有 /dev/tty 或 init 失败
检查 busybox 是否安装完整
原文链接:,转发请注明来源!