多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Cortex-A5极简Mini电脑套件:从Bootloader到Android镜像的完整构建

Cortex-A5极简Mini电脑套件:从Bootloader到Android镜像的完整构建 从标题「A5 minimal Mini-computer Kit」来看很多人第一反应是这不就是个树莓派类的小主机吗但真正上手玩过之后你会明白这是一套完全不同的东西。它不追求性能不追求图形桌面甚至不追求开箱即用——它追求的是把一台能跑Linux和Android的电脑压缩到一块比名片还小的板子上让你亲手把操作系统从Bootloader一路搭起来。这篇文章我就围绕这套极简套件把硬件选型、系统构建、固件调试、Android镜像折腾的完整过程拆开讲透适合两类人看一类是刚入门嵌入式、想把内核启动流程搞明白的开发者另一类是手里已经有一块类似核心板、却不知道怎么让它跑起来的极客玩家。1. 这个套件到底给谁玩的A5 minimal的项目定位1.1 它不是树莓派的替代品而是最小可运行系统的教科书先把这个套件的定位说清楚。你在电商平台或者二手硬件群里看到A5 minimal Mini-computer Kit这类东西别拿它和树莓派比。树莓派是一个完整的单板计算机到手刷镜像就能用跑的是完整的桌面系统而这块以Cortex-A5为核心的极简套件它的设计目标只有一句话用最少的硬件资源把一个能登录、能跑服务、能学习系统原理的Linux环境跑起来。这么说可能有点抽象我换个角度。你看整个套件的硬件配置如果按够用就好的原则砍一刀最后剩下的就是一颗Cortex-A5内核的处理器128MB左右的内存一张MicroSD卡做存储再加一个串口或者HDMI输出。没有WiFi模块、没有蓝牙、没有GPU撑腰的复杂桌面环境。但这恰恰是它的价值——因为硬件简单到不能再简单你反而能把操作系统从零到一完整地理解清楚。我最初玩这套东西的动机很简单我在一台配置很一般的服务器上装了各种服务之后发现自己对Linux的理解其实还是黑盒。内核怎么启动的、init进程怎么接管、根文件系统怎么挂载、用户态程序怎么被调度这些概念我全知道但从来没亲手搭过。后来我在一块Cortex-A5核心板上把这套流程完整走了一遍才算是真正把知识串起来了。1.2 适合哪几类人从我玩下来的经验看这套A5极简套件适合的人群非常明确但范围不算大。第一类是嵌入式初学者想理解ARM平台从裸机到Linux的完整启动链路第二类是DIY极客喜欢用低成本的硬件搭建信息屏、内网小服务器、串口调试工具这类小玩意儿第三类是做Android系统定制开发的人想在一个干净的硬件基础上验证AOSP的构建和烧录流程。如果你已经是资深的Linux内核开发者那这套东西对你来说可能太简单了你需要的是一块性能更强、外设更丰富的开发板如果你只是想要一个桌面小电脑那也不适合它的性能决定了它没法运行现代浏览器和办公软件。它的定位就是一款学习工具轻量服务器的组合体心态摆正了才不会失望。1.3 一套完整套件里都有什么我手里这套minimal kit的典型配置是这样的一块集成了Cortex-A5核心SoC的核心板大约半个巴掌大小一块配套的底板上面引出电源接口、MicroSD卡槽、串口调试引脚和一个USB Host口一张预装好系统或者空白的MicroSD卡一根USB转TTL串口线。整套下来也就是一个普通移动硬盘盒的体积。需要注意的是市面上类似套件的硬件细节千差万别有的核心板不带底板有的带HDMI接口有的甚至把DDR直接焊在了核心板上。你在入手之前一定要确认两件事一是这款SoC有没有公开的Linux内核支持和Bootloader源码否则后面系统构建寸步难行二是串口调试引脚有没有引出来这是你后期排障的唯一可靠通道。这两点比板子本身好不好看重要一百倍。2. 硬件选型复盘每一颗料都是够用就好2.1 为什么选Cortex-A5而不是A7或者A53你可能会有疑问现在嵌入式领域满大街都是Cortex-A7、Cortex-A53的芯片性能和能效都要更好为什么这套极简方案偏偏选老旧的Cortex-A5这个问题我在定方案的时候也纠结过。答案其实不复杂第一Cortex-A5核心是ARMv7指令集里非常精简的一档单核频率通常在 400MHz到1GHz 之间功耗极低一个USB口供电就能带起来第二它的IP授权和对应的SoC方案在二手器件市场里价格低到离谱一套下来成本可能只有你买一块入门级树莓派零头的零头第三正因为它的性能不够强你才没有偷懒的空间不能靠堆硬件配置掩盖系统构建的问题。我用一个表格来对比这三代核心的差别方便你理解选型的逻辑核心指令集典型频率典型内存配套定位系统构建难度Cortex-A5ARMv7-A400MHz~1GHz128MB~512MB极简入门、低功耗IoT中等需要手动裁剪Cortex-A7ARMv7-A600MHz~1.5GHz512MB~1GB低成本平板、入门开发板较低资料较多Cortex-A53ARMv8-A1.2GHz~2GHz1GB~4GB主流高性能嵌入式低生态完善从这个表格可以看出来A5的性能确实垫底它的价值在门槛足够低、结构足够清晰。Cortex-A7资料虽然多但通常配套的外设也更复杂GPU、WiFi、蓝牙一堆东西要适配反而不利于你聚焦最小系统这件事。A53则是奔着高负载场景去的和minimal的概念相悖。所以综合下来A5反而是这整套玩法里最精准的选择。2.2 内存与存储的容量上限如何定内存这块很多新手第一反应是128MB怎么够用。但你先想想这套系统要跑什么一个BusyBox编译的用户空间、一个精简内核、一个SSH服务、一个轻量的Web服务比如nginx再加一个你手动写的小程序这套组合在128MB内存下完全没有压力。我用实测数据说话系统启动后进入空闲状态内存占用通常在 30MB~40MB 左右跑一个nginx提供静态页面服务内存占用能控制在 50MB 以内就算再开一个用C语言写的后台守护进程也基本没有压力。存储方面一张MicroSD卡就足够了。系统镜像加根文件系统总共控制在 300MB 以内非常轻松所以8GB的卡就绰绰有余。你需要规划的只是分区表一个几十MB的boot分区放内核和设备树一个几百MB的rootfs分区放根文件系统。这里有个很重要的经验分区表在烧录时就要想好不然后面想调整整套系统都要重新弄一遍。2.3 底板设计上极简到底能砍到什么程度既然是minimal套件底板的功能就非常克制。我对这类底板的建议是保留这几样东西一个MicroUSB或者Type-C的电源输入端口、一个MicroSD卡槽、一组串口调试引脚、一个USB Host口。其他的都可以砍掉。以太网口可以不要因为你可以用USB转网卡或者直接USB连接方式共享网络音频接口可以不要你根本没地方插喇叭复杂的GPIO排针也可以不要因为它不是单片机你很少会去裸操GPIO。砍掉这些之后底板面积可以做得非常小。我见过一些极致的玩家甚至直接把核心板引脚用杜邦线飞线到USB转串口芯片上连底板都不用。但我在实际玩过之后建议你还是配一块底板因为飞线供电稳定性差稍微带一点负载就容易出现复位重启排查起来非常折磨人。底板不仅是物理支撑它更重要的是提供一个稳定的电源转换电路——这一点在后面的调试章节我会详细讲。3. 系统构建全流程从Bootloader到能开机是一个坎3.1 固件和启动流程先搞清A5怎么跑起来很多第一次玩ARM Linux的人会卡在第一步就是不知道开机之后系统是怎么把控制权一步步交给操作系统内核的。A5平台的启动流程其实很固定总共四步SoC内部的ROM Boot程序上电后先执行初始化DDR内存和基本时钟然后它去读取启动介质这里的启动介质就是MicroSD卡上特定位置的BootloaderBootloader加载到内存后负责初始化串口、时钟、内存控制器并且把内核镜像和设备树文件从存储介质读进内存最后跳转到内核入口内核接管硬件挂载根文件系统启动第一个用户态进程。在A5这类老旧的ARM SoC上Bootloader首选还是U-Boot。虽然U-Boot的代码量看起来庞大但它的好处是文档齐全、社区活跃、几乎所有老ARM平台都有现成的适配。你需要做的工作不是从零写一个Bootloader而是获取芯片厂商或者开源社区维护的U-Boot源码然后为你的板子配置默认环境变量包括串口波特率、启动介质、内核加载地址、设备树加载地址这些关键参数。这里我特别提醒一句不要跳过Bootloader直接从裸机跳到内核。我在早期玩类似板子的时候图省事直接烧了个内嵌了简化启动流程的固件系统也跑起来了但之后一旦内核启动失败我连一点调试手段都没有非常被动。U-Boot提供一个交互式命令行你可以随时停下来查看内存、修改变量、手动引导内核这些能力在排障时价值巨大。3.2 内核配置把不需要的全砍掉内核构建是整个过程中最需要耐心的一步。Cortex-A5使用的是ARMv7指令集所以你在配置内核时需要选择ARM体系结构并且针对具体的SoC选择对应的平台支持。如果你拿到的是比较常见的A5方案内核源码里通常已经有现成的平台配置你可以找一个最接近的defconfig作为起点。defconfig只是一个骨架配置真正重要的裁剪工作在这里才开始。我的建议是你可以把跟这个套件无关的子系统全部关掉图形界面相关的DRM、GPU、声卡驱动无线网络栈蓝牙协议栈以及各种用不到的文件系统和外设驱动。这样裁剪完的内核编译出来的zImage通常只有 2MB~3MB内存占用也会低不少。有一个细节值得讲一下设备树Device Tree在ARM Linux里扮演的角色越来越重要而A5时代的很多SoC还在用传统的板级文件描述硬件信息两者之间的选择会影响你后续添加外设的难度。我的建议是优先选择使用设备树的内核版本这样你后期如果想通过底板扩展一个USB转串口芯片或者传感器只需要修改设备树节点就行不用重新编译内核。3.3 根文件系统BusyBox glibc的最小组合内核跑起来之后下一步就是根文件系统。对于minimal这个定位我强烈推荐用BusyBox来做最基础的用户态工具集。BusyBox的核心思路就是把几十个标准Unix命令ls、cat、mount、ifconfig等打包进一个可执行文件里通过符号链接的方式模拟出完整的命令行环境体积压缩到极致。但BusyBox只能帮你提供命令工具真正决定系统能力上限的是C库。在极小体积的场景下你可以用uClibc-ng或者musl但我用下来的感觉是如果目标是学习和二次开发直接用glibc更省心因为你后续安装的很多软件包都是默认基于glibc编译的用它做根文件系统可以省掉大量兼容性调试时间代价只是体积上多占十几MB。构建根文件系统的时候我建议你两步走第一步用交叉编译工具链构建BusyBox安装到目标目录第二步手动创建标准目录结构/etc、/proc、/sys、/dev、/tmp编写init脚本。init脚本是整个根文件系统里最关键的文件因为内核启动完成后执行第一个用户态程序就是它而它要负责挂载proc和sysfs虚拟文件系统、配置网络、启动shell。我用过的最简init脚本大约长这样#!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t devtmpfs devtmpfs /dev echo A5 minimal system is up. exec /bin/sh就这几行足够让系统启动后进入一个可用的root shell。你可以在串口终端上看到登录提示然后执行各种命令。一个可交互、可编程的最小Linux系统就这样从无到有地跑起来了。4. 把Android挤上这块板可行但别抱太高期望4.1 AOSP对ARMv7老内核的支持边界既然套件相关的热搜词里有android package kit下载我就知道很多人其实是想把这套极简套件跑成Android系统。这个想法本身很有意思也确实可行——Cortex-A5是ARMv7-A架构而AOSPAndroid Open Source Project历史上对ARMv7-A是有完善支持的。但你别期待能在这块板上跑出手机一样的效果这不现实。先说根因。现代Android系统的用户空间是按照比较高的硬件标准设计的ART虚拟机在运行应用时需要相对充裕的内存和较快的读写速度而A5核心、128MB内存这个组合只能勉强支撑系统本身启动运行稍微复杂一点的应用就会出现启动缓慢、后台进程被频繁杀掉的情况。如果你改装的是轻量级的Android变种比如各种精简掉GMS的定制版本体验会好一点但也仅仅是能开机、能触控、能跑点小工具的程度。从AOSP的角度看编译目标可以选aosp_arm-eng这类老式镜像目标它在编译时会将产物打包成Android标准的system、boot、vendor等镜像格式然后通过fastboot或者你Bootloader支持的烧录方式写入存储介质。这里涉及到的就是所谓的android package kit——本质上就是组装好的一套镜像文件包包括引导镜像、系统镜像、内核镜像。对喜欢折腾的人来说更合理的路径是自己从AOSP源码编译出这一套包而不是去下载那些来路不明的预编译包因为硬件差异会导致绝大多数镜像根本跑不起来。4.2 构建与打包自己动手做一套Android镜像如果你决定自己构建过程大概是这样的先把AOSP源码同步到本地——这是个耗时不少的操作源码树很大强烈建议预留足够的磁盘空间然后进入源码目录执行环境初始化选择编译目标接下来是漫长的编译过程在接近配置的机器上也会耗时很久。编译完成后产物会输出在out/target/product/目录。你重点关注这几个文件boot.img包含内核和ramdisk、system.img系统分区镜像、userdata.img用户数据分区。这三者加上一个与你的Bootloader匹配的DTB设备树文件就构成了完整的烧录包。烧录的时候用fastboot命令或者通过U-Boot的fastboot功能接口把各个镜像写到对应的分区位置。这里有个非常关键的坑Android内核和普通Linux内核的差异不只是配置项不同Android内核通常需要开启Binder驱动、ashmem驱动、ion内存管理这些特有组件。如果你的板子对应的内核源码里没有这些补丁那编译出的boot.img引导不起来。所以在你准备折腾Android之前先确认你手头内核源码版本是否包含Android支持这是决定成败的第一步。4.3 跑起来之后的真实体验如果一切顺利你会看到一个Android系统在这块极简板子上慢慢启动起来。但我的真实体验是开机过程比Linux要漫长得多首次启动甚至要几分钟界面操作会有明显卡顿触控响应延迟也能感知到。Android的动画渲染库对GPU有依赖而这套极简硬件没有像样的GPU单元所以很多渲染只能靠CPU去扛。你能得到的体验大致相当于十年前的低端安卓手机。但如果你把期望放对了这个实验的价值还是很大的。你会直观理解到Android系统的分层结构明白为什么同样的Linux内核加了一层Android用户空间之后就变成了完全不同的操作系统你也会明白为什么Android对内存的需求比传统Linux大这么多。这种亲手把Android塞进极简硬件的经验比任何系统的架构课程都来得深刻。5. 组装与调试的实测心得那些教程里不会写的坑5.1 串口调试是最可靠的救命通道如果你打算玩这套系统第一件要准备好的工具就是一根USB转TTL串口线并且把串口调试当成绝对主力。HDMI输出在这个硬件上可能存在兼容性问题内核启动早期的打印信息在HDMI上是看不到的而串口在Bootloader阶段就能输出大量信息能让你完整地观察到从ROM Boot到内核启动的全过程。串口的接线和参数先确认一下核心板的串口调试引脚通常是TXD、RXD、GND三根和USB转TTL线交叉连接也就是板子的TXD接转接线RXD板子RXD接转接线TXDGND互联。波特率一般设置为 115200数据位8位无校验一个停止位也就是常说的8N1。我用的是screen命令工具直接就能连上screen /dev/ttyUSB0 115200连上之后按下复位键你应该能看到U-Boot的启动日志。如果串口没有任何输出先检查接线和供电不要急着怀疑系统坏了。我在调试初期遇到的第一个问题就是转接线质量差导致电平不稳换线之后一切正常。从这之后我学到一个教训硬件调试时第一件事永远是先确认串口能出字再谈其他的。5.2 供电与散热的取舍这套极简硬件看起来功耗不高但供电问题反而是最常见的故障来源。A5核心本身功耗不高但加上底板上的USB转换电路、MicroSD卡读写时的电流波动如果你用一台电脑的USB口直接供电很容易出现电压跌落表现就是系统无故重启、内核崩溃、SD卡识别不稳定。我建议你还是用一个独立的5V电源适配器或者至少用一根质量好一点、线损小的USB线。散热方面Cortex-A5在跑满频率时发热量并不大裸奔情况下芯片表面温度也就温热的程度。但如果你给它套了一个封闭的亚克力外壳又没有通风孔长时间编译或者跑负载时温度还是会积累起来。我的做法是贴一块小尺寸铝制散热片效果立竿见影。这不算刚需但属于花小钱换稳定的投资。5.3 老架构的软件生态局限与应对策略关于A5的软件生态我想说几句实话。Cortex-A5在现在的嵌入式市场里确实已经算古董级别了新的主线内核虽然还支持ARMv7架构但对特定老SoC的板级支持越来越边缘化很多新版本的跑Linux发行版官方仓库也不再提供针对ARMv7老平台的预编译包。这就意味着你不太可能像树莓派那样下载一个官方系统刷进去就能玩很多软件需要自己交叉编译。应对策略有两种。一种是彻底拥抱极简的定位能用BusyBox的就不用全功能工具能自己写小程序解决的就不引第三方依赖让系统维持在一个可控、可重建的状态。另一种是拥抱容器方案虽然硬件性能弱但运行一个轻量级的容器运行时跑隔离环境还是可以接受的不过这需要你先把内核的相关配置项启好比如cgroup、namespace、overlayfs。我个人的建议是在刚开始玩的时候用第一种策略先把系统的各个角落摸清楚再考虑第二种玩法。最后再分享一个小技巧也算是我踩过几十次坑之后总结出来的每次编译完内核、根文件系统或者Android镜像都要把当时的配置文件和编译命令原样记录下来连同生成的镜像文件一起归档。老架构的调试链路非常脆弱可能你过了三个月之后回头要修改一个功能却发现当初的配置已经记不清了重新摸一遍的成本远比你想象的还高。这套A5 minimal套件最大的乐趣不在于它有多少功能而在于它逼着你把计算机系统最底层的逻辑亲手实践了一遍——这种扎实感才是折腾它最有价值的回报。
返回列表