许多人拿到一块陌生的ARM板子,第一反应就是想把Linux跑起来。这个过程看起来复杂,其实拆解开也就几个关键步骤——内核配置、设备树编写、根文件系统制作,外加一个靠谱的交叉编译环境。只要理清思路,手里有芯片手册和原理图,系统移植并不是什么神秘的事。
为什么要做ARM Linux系统移植
ARM处理器架构千差万别,同一家公司出的不同型号,外设地址和中断号都可能是两码事。Linux内核虽然支持大量硬件,但它不可能覆盖所有板子上的细节。厂商提供的BSP往往只适配了他们自家的开发板,换个RAM大小或者换个Flash型号,系统可能就直接起不来。所以,移植的目的是让Linux内核认知你的板子,知道内存有多大、串口在哪、网卡怎么访问,把硬件细节转化成内核能理解的语言。一个成功移植的系统,启动日志里不会有任何设备初始化失败的信息。
交叉编译环境怎么搭建最省心

ARM板子上跑不了GCC编译器,你必须用PC给ARM编程序。安装交叉编译器时,很多人喜欢从源码折腾linux获取当前时间,其实完全没有必要。直接从Linaro官网或者芯片厂商的下载页面拿现成的工具链最靠谱。建议选arm-linux-gnueabihf这个版本,它支持硬件浮点,性能比软浮点好不少。解压后把bin目录加到PATH环境变量里就行了。要注意的是编译器和内核版本的匹配关系,比如用gcc 12编译Linux 4.19内核会报语法错误,这时候用gcc 9反而稳如老狗。另外记得安装ncurses-dev和flex、bison这些辅助工具,否则make menuconfig界面都出不来。
内核配置和设备树该怎么搞

拿到芯片手册后,先别急着从零配起。找一个你用的芯片系列的原厂开发板配置作为基础,比如stm32mp157d-ev1_defconfig这样的文件,把它拷过来再改。用make menuconfig打开图形界面,主要调整三部分:CPU类型选对、内存控制器参数匹配、取消掉你的板子上没有的外设驱动。比如你的板子没有WiFi,就把所有无线网络驱动关掉,这样能省不少编译时间。设备树才是真正头疼的部分。你需要新建一个.dts文件,把串口、网卡、GPIO、I2C这些节点的寄存器地址和中断号填对。这里最容易踩坑的是时钟频率配置,很多人抄了别的板子的设备树,结果串口波特率死活不对。建议拿着芯片手册一页一页对,特别是pinctrl部分,管脚复用设置错了,任何外设都别想用起来。
根文件系统如何快速生成

内核跑起来只是第一步,没有文件系统arm linux系统移植,你连ls命令都敲不了。最简单的办法是用BusyBox来构建。下载最新版的BusyBox源码,同样用交叉编译器编译。配置时一定要勾选“Build static binary”选项,否则你还得费劲去移植动态链接库。编译完成后会生成一个_install目录,里面就是根文件系统的骨架了。把这个目录里的内容拷到一个空目录,然后手动创建etc/inittab、etc/fstab和dev/console、dev/null这些必备节点。如果你嫌弃手动创建太麻烦,直接拿Buildroot工具,配置菜单里选好CPU架构和应用包,它自动帮你生成完整的根文件系统镜像。只要注意把init进程指定为busybox的init程序,系统就能顺利进入shell。
启动参数和引导加载程序怎么配合

U-Boot的配置同样关键。你需要在U-Boot里设置好bootargs环境变量,告诉内核根文件系统在哪里、用什么方式挂载。比如用nfs挂载调试时,bootargs就写成“root=/dev/nfs nfsroot=192.168.1.100:/nfsroot ip=dhcp”。如果要把系统固化到Flash上,bootargs就要改成“root=/dev/mtdblock4 rootfstype=jffs2”。很多人卡在启动参数上,明明内核和设备树都没问题,可系统起来后就报“Kernel panic -- not syncing: VFS: Unable to mount root fs”arm linux系统移植,多半是bootargs写错了挂载路径或者文件系统类型。U-Boot的环境变量可以用saveenv保存到Flash里,别每次重启都手动敲一遍。
移植ARM Linux系统这件事,最考验的不是写代码的能力,而是读文档和查资料的耐心。每一步出错,内核都会在串口输出里留下蛛丝马迹。只要能看懂启动日志里的那几行错误提示,找到芯片手册对应的章节,问题往往就解开了。按部就班把交叉编译、内核配置、设备树、文件系统、U-Boot这五块搞定linux虚拟主机,你的板子就能稳稳当当跑起Linux。
