4. 高通平台固件与分区布局
在高通Snapdragon双系统设备上,固件并不是“一整块”烧录进eMMC/UFS的,而是由引导链逐级加载、由分区表精确定位的一组镜像。理解分区布局,等于掌握了双系统能否启动、能否回滚、能否安全升级的底层规则。本节围绕GPT、A/B、动态分区三条主线,说明双系统镜像到底应该放在哪里、为什么这样放,以及实际配置时如何验证。
一、GPT:所有分区的“地址簿”
高通平台设备普遍使用UEFI引导,磁盘分区采用GPT(GUID Partition Table)。GPT头部位于LBA1,包含分区表项数组(通常128项,每项128字节),每项记录分区类型GUID、唯一分区GUID、起始LBA、结束LBA、属性与分区名。GPT同时保留主备两份(磁盘首尾各一份),并带CRC32校验,因此分区表损坏时可用备份恢复。
对双系统而言,GPT最重要的价值是“分区名可读且可寻址”。高通XBL(eXtensible Boot Loader)在加载ABL(Application Bootloader)时,会按分区名查找abl_a/abl_b;ABL再按boot_a/boot_b、system_a/system_b等名称加载内核与系统。因此双系统镜像的存放策略,本质上是“在GPT中预留哪些分区名、每个分区多大、由谁读写”。
实际查看分区表可用:
# 在设备shell或host端(需root/权限)
sgdisk -p /dev/block/sda
# 或
parted /dev/block/sda print
# 查看分区名与GUID
ls -l /dev/block/by-name/
典型高通设备GPT分区(示例,容量因机型而异):
| 分区名 | 作用 | 典型大小 |
|---|---|---|
| gpt | 分区表主/备 | 约1MB |
| xbl_a/xbl_b | 一级引导 | 约1MB |
| abl_a/abl_b | UEFI应用引导 | 约1MB |
| boot_a/boot_b | 内核+dtb+ramdisk | 64–128MB |
| dtbo_a/dtbo_b | 设备树叠加 | 8–16MB |
| vbmeta_a/vbmeta_b | AVB校验元数据 | 64KB–1MB |
| super | 动态分区容器 | 数GB |
| userdata | 用户数据 | 剩余空间 |
| misc | 启动控制/恢复命令 | 1MB |
二、A/B分区:无缝升级与回滚的基础
A/B(Seamless Update)把关键分区成对存在:_a槽与_b槽。设备当前运行在某个槽(slot),升级时把新镜像写入另一个槽,写完后通过misc分区或BCB(Bootloader Control Block)设置“下次从新槽启动”。若新槽启动失败,bootloader可回退到旧槽,实现回滚。
槽状态由boot_control HAL管理,常见状态包括:active、bootable、successful、unbootable。升级流程中,新槽先标记为bootable,启动成功后标记successful;若连续失败,则标记unbootable并切回旧槽。
双系统与A/B的关系需要特别澄清:A/B是同一系统的两个副本,不是两个不同操作系统。双系统通常占用_a槽运行系统1、_b槽运行系统2,或使用独立分区名(如system_alt)。若直接复用A/B槽,需注意升级时不能覆盖另一系统所在槽,否则会破坏双系统。因此更稳妥的做法是:双系统各自使用独立分区或独立slot,并在misc中明确记录当前启动目标。
三、动态分区:super分区与逻辑分区
Android 10起引入动态分区(Dynamic Partitions),把system、vendor、product、system_ext等打包进一个super物理分区,内部再划分为逻辑分区。逻辑分区大小可在OTA时调整,不再受GPT固定大小限制。super分区使用liblp元数据描述逻辑分区布局,元数据位于super起始处,含两个槽(slot 0/1)的元数据副本。
查看逻辑分区:
# 查看super元数据
lpdump /dev/block/by-name/super
# 查看逻辑分区映射
ls -l /dev/block/mapper/
# 典型输出:system、vendor、product、system_ext
动态分区对双系统的意义在于:如果两个系统都基于Android动态分区,则super只能承载一套逻辑分区布局。双系统要么各自使用独立super(需GPT预留两个super分区),要么把第二系统放在独立物理分区(如system_alt),由ABL根据启动参数选择挂载目标。实际项目中,受super分区容量限制,双系统更常见的是“主系统动态分区+副系统独立分区”的混合布局。
四、双系统镜像存放策略与启动选择
综合以上三条主线,双系统镜像存放可归纳为三种策略:
- 独立分区策略:GPT中为系统2预留
boot_alt、system_alt、vendor_alt等分区,与系统1完全隔离。优点是互不影响、升级安全;缺点是占用固定空间,GPT分区数量有限。 - A/B槽复用策略:系统1用
_a槽,系统2用_b槽。优点是节省分区;缺点是OTA会覆盖另一系统,需禁用自动A/B升级或改造升级逻辑。 - 动态分区+独立super策略:GPT预留
super与super_alt,两套逻辑分区各自独立。优点是灵活扩容;缺点是占用空间大,需ABL支持双super选择。
启动选择通常由ABL读取misc分区中的BCB命令或自定义标志位决定。例如在misc中写入boot-slot:alt,ABL解析后加载boot_alt。也可通过fastboot命令临时切换:
fastboot getvar current-slot
fastboot --set-active=a
fastboot --set-active=b
# 自定义双系统可扩展为:
fastboot oem set-boot-target alt
验证分区布局是否正确的关键检查点:一是ls -l /dev/block/by-name/确认所有预期分区名存在;二是lpdump确认super内逻辑分区与槽元数据一致;三是fastboot getvar current-slot与misc内容一致;四是分别启动两个系统,确认各自挂载的分区不串扰。若出现启动后进入recovery或反复重启,优先检查misc中的BCB命令与vbmeta校验是否匹配当前槽。
misc中显式记录启动目标。sgdisk --backup),并确认ABL支持自定义分区名查找。