本文建议在对高通8155车机系统有一定的了解下进行阅读
文章目录
前言
高通SA8155的基建默认采用的是A/B系统升级作为OTA升级方案。
然而,从Android 10开始,Android引入了动态分区,为VAB(Virtual A/B)升级机制做铺垫,从底层GUID分区表开始做改造。随着Android版本的迭代,动态分区关闭所造成的维护成本只会越来越高,所以高通车载芯片的基建还是提早做了两手准备,给出了带动态分区和不带动态分区的两种A/B升级方案。
本文探索了,Android不带动态分区的A/B升级方案下,Host QNX中的资源管理模块VMM(Virtual Machine Manager)是如何处理两个系统的slot状态。
一、FDT设备树中的关键配置
以第二篇探索里的第二章节第二小节,FDT设备树,作为引子(文末有参考链接)。
在文件system.build.tmpl中,配置/vm/images/la_dp_disabled.config用于动态分区关闭的情况:
###########################################
# When Dynamic Parition is not enabled #
###########################################
/vm/images/la_dp_disabled.config={...
# vbmeta /dev/block/vdh
vdev vdev-virtio-blk.so loc 0x1c140000 intr gic:49 hostdev /dev/disk/la_vbmeta# Misc /dev/block/vdg
vdev vdev-virtio-blk.so loc 0x1c130000 intr gic:48 hostdev /dev/disk/la_misc...
# user-data /dev/block/vdc
vdev vdev-virtio-blk.so loc 0x1c0f0000 intr gic:43 threads 4 hostdev /dev/disk/la_vendor# user-data /dev/block/vdb
vdev vdev-virtio-blk.so loc 0x1c0e0000 vmid 2 intr gic:39 hostdev /dev/disk/la_userdata dio enable max-io-size 512k# system /dev/block/vda
vdev vdev-virtio-blk.so loc 0x1c0b0000 intr gic:40 threads 4 hostdev /dev/disk/la_system}
得到推论,也是遗留的问题:“动态分区不使能的情况下,Android系统没有ab分区,难道不是ab系统升级吗”。
尽管可以从Android官网可以找到相关线索,但是建议参考洛奇看世界-CSDN博客中关于Android A/B System OTA分析(见文末参考链接),这篇博客里图文并茂的对比了传统OTA分区系统和A/B分区系统,并且提到了“传统OTA的分区”,“只有一套分区”系统。
从分区配置的角度来看,关闭动态分区的情况下,Android配置的是非A/B系统分区,那么,
- Android系统不应该存在ab slot的说法,slot状态是怎么一回事?
- 基建是如何实现Android的AB系统升级呢?
二、VMM中的关键codes
1.Android的slot状态
在vmm_fsm.c文件中,代表Guest Android slot状态的成员变量bank,存在‘a’,'b','\0'三种状态('\0'为空):
int get_gvm_boot_slot_info(struct gvm_context* ctx)
{
int ret = 0;
struct boot_slot_info slot_info;
...
if (slot_info.target_slot == 'a' || slot_info.target_slot == 'b')
ctx->bank = slot_info.target_slot;
else
ctx->bank = '\0';
...
err:
return ret;
}
如果是AB系统,'\0'空状态的存在似乎说不过去,有可能是个BUG;如果是非AB系统,'\0'空状态的存在,似乎还是合理的。
而代表Host QNX的slot状态仅有‘a’