Linux 移植手册
Linux 系统因其开源、灵活和高度可定制性,被广泛应用于嵌入式设备、服务器、物联网终端等多种场景,将 Linux 移植到新的硬件平台是一项复杂但系统化的工程,涉及硬件适配、内核配置、驱动开发、文件系统构建等多个环节,本手册将从准备工作到系统验证,详细梳理 Linux 移植的核心步骤与关键注意事项,为开发者提供清晰的实践指南。

移植前的准备工作
在启动 Linux 移植项目前,充分的准备工作是确保移植过程顺利的基础,需要明确目标硬件平台的 specifications,包括处理器架构(如 ARM、x86、RISC-V)、主频、内存大小及类型、存储介质(如 eMMC、NAND Flash、SD 卡)以及外设接口(如 UART、I2C、SPI、USB 等),硬件手册和数据手册是不可或缺的参考资料,需仔细研读以理解硬件寄存器配置、引脚复用功能及初始化流程。
选择合适的 Linux 内核版本至关重要,建议优先选用目标硬件厂商提供的官方支持内核或 Long Term Support(LTS)版本,这类内核通常包含对主流硬件的良好支持,且社区维护稳定,需确认交叉编译工具链的兼容性,工具链需与目标架构匹配(如 arm-linux-gnueabihf 用于 ARMv7 架构),并确保其版本与内核版本一致,以避免编译兼容性问题。
搭建开发环境是必要步骤,在宿主机(如 Ubuntu、CentOS)上安装必要的编译工具(如 gcc、make、binutils)、版本控制工具(git)及内核调试工具(如 gdb、kgdb),建议使用虚拟机或 Docker 容器隔离开发环境,避免宿主机环境差异对移植过程造成干扰。
内核配置与编译
内核是 Linux 系统的核心,其配置与编译是移植工作的重中之重,获取内核源码并解压,可通过 git clone 官方仓库或使用厂商提供的预配置内核,进入内核源码目录后,执行 make menuconfig 启动图形化配置界面,或直接使用厂商提供的 .config 文件作为基础模板。
配置内核时,需重点关注以下内容:
- 处理器架构与类型:在 “System Type” 选项中选择目标架构(如 ARM)及具体处理器型号(如 ARMv7)。
- 设备树支持:启用 “Device Tree Support” 并配置目标硬件的设备树文件(
.dts),设备树是描述硬件拓扑结构的关键文件,需根据硬件手册修改节点、寄存器地址及中断号。 - 驱动程序:根据硬件外设情况,启用或禁用对应驱动,如串口驱动(UART)、存储驱动(MMC、NVMe)、网络驱动(Ethernet、Wi-Fi)等,对于不支持的驱动,需后续自行开发。
- 文件系统支持:选择合适的文件系统类型,如 ext4、jffs2 或 ubifs,并启用相关编译选项。
配置完成后,执行 make -j$(nproc) 进行编译,-j 参数可利用多核加速编译,编译成功后,会在 arch/<arch>/boot/ 目录下生成内核镜像(如 zImage、uImage)及设备树文件(.dtb),若编译失败,需检查日志中的错误信息,常见问题包括依赖库缺失、配置选项冲突或硬件参数错误。

引导加载程序(Bootloader)移植
引导加载程序是硬件加电后运行的第一段代码,负责初始化硬件、加载内核并启动系统,常见的 Bootloader 包括 U-Boot、GRUB 及 Barebox,U-Boot 因其开源、跨平台特性被广泛使用,移植 U-Boot 需以下步骤:
- 获取 U-Boot 源码:从 U-Boot 官方仓库或厂商分支获取代码,并选择与目标硬件接近的板级支持包(BSP)作为基础。
- 配置 U-Boot:执行
make <board_name>_defconfig加载默认配置,或使用make menuconfig手动调整配置,包括串口波特率、启动方式(如从 SD 卡、eMMC 启动)、内核及设备树加载地址等。 - 修改硬件初始化代码:根据目标硬件手册,调整
board_init()函数中的时钟配置、内存控制器初始化及外设引脚复用设置。 - 编译与烧录:执行
make -j$(nproc)编译 U-Boot,生成可执行文件(如 u-boot.bin),通过 JTAG、SD 卡或烧录工具将 U-Boot 写入存储介质的起始位置。
U-Boot 移植后,需验证其是否能正确识别硬件、加载内核镜像及设备树,可通过 U-Boot 的命令行接口(CLI)执行 printenv 查看环境变量,或使用 fatload、bootm 等命令手动测试启动流程。
设备树(Device Tree)开发
设备树是 Linux 内核与硬件平台之间的“桥梁”,其作用是描述硬件资源的分配与拓扑结构,对于新硬件平台,通常需要编写或修改设备树文件(.dts),设备树开发的核心步骤如下:
- 确定根节点:在
dts文件中定义根节点 ,并指定兼容的板级名称(如 compatible = “vendor,board-name”)。 - 添加 CPU/内存节点:描述处理器的类型、主频及内存基地址和大小,需与硬件手册中的内存映射一致。
- 配置外设节点:为每个外设(如 UART、I2C 控制器、GPIO 控制器)定义节点,包括寄存器地址、中断号、时钟频率及引脚复用配置,UART 节点需指定寄存器基地址、中断号及时钟频率。
- 编译设备树:使用内核提供的
dtc工具将.dts文件编译为.dtb文件,并确保其与内核版本匹配。
设备树编写完成后,需在内核启动时通过 Bootloader 加载,可通过 U-Boot 的 fdtaddr 和 bootargs 环境变量指定设备树地址及启动参数(如 console=ttyS0,115200)。
文件系统构建与烧录
文件系统是 Linux 系统存储用户数据和应用程序的载体,常见的嵌入式文件系统包括轻量级的 BusyBox、Read-only Rootfs 及可读写的 ext4,构建文件系统可使用现成的根文件系统镜像(如 Buildroot、Yocto Project),或手动创建最小化系统:
- 创建根目录结构:在宿主机上创建根目录,并添加必要目录(如 /bin、/sbin、/etc、/lib)。
- 移植 BusyBox:编译 BusyBox 并将其可执行文件复制到 /bin 目录,提供基本的 Linux 命令(如 ls、cd、mount)。
- 添加动态库:从交叉编译工具链中复制目标架构的动态库(如 libc.so.6、libpthread.so.0)到 /lib 目录,确保应用程序运行时依赖的库可用。
- 配置系统服务:创建
/etc/inittab和/etc/fstab文件,定义系统启动时的初始化流程及文件系统挂载信息。
文件系统构建完成后,可通过 dd 命令或烧录工具将其写入存储介质(如 SD 卡),若使用 UBI/UBIFS 文件系统,需先在分区中创建 UBI 卷并挂载。

系统调试与优化
Linux 移植的最后阶段是调试与优化,确保系统稳定运行并满足性能需求,调试工具包括串口日志、内核打印(printk)及远程调试(如 kgdb),常见问题及解决方法包括:
- 内核启动卡死:检查设备树中的寄存器地址、中断配置及内存初始化是否正确,可通过串口打印关键节点的初始化状态。
- 驱动加载失败:确认驱动代码中的硬件操作(如寄存器读写、DMA 配置)与硬件手册一致,并检查内核配置中是否启用相关驱动。
- 性能瓶颈:使用
perf工具分析 CPU 使用率,优化中断处理流程或调整内核调度参数(如CONFIG_HZ)。
优化方面,可裁剪内核以减少不必要的驱动和功能,启用内核压缩(如 LZ4)以降低镜像大小,或调整文件系统参数(如 ext4 的 noatime 选项)提升 I/O 性能。
Linux 移植是一项涉及硬件、软件和系统知识的综合性工程,需要开发者具备扎实的理论知识和丰富的实践经验,通过遵循本手册的步骤,从准备工作到系统验证,逐步排查问题并优化性能,可高效完成 Linux 系统在新硬件平台的移植,在实际项目中,还需结合硬件特性和应用需求灵活调整,最终实现稳定、高效的嵌入式 Linux 系统。


















