高通公司 MSM8K GPT异常原因分析无法开机的问题
问题分析过程如下面:
一、
MSM8916台gpt概率问题:采用QPST emmc software download下载软件工具后,无法开机。例如下面的附图:
log分析是userdata分区未成功mount 。
二、
adb shell ls /dev/block 显示。开机失败的机器。比正常开机的机器少一个分区:mmcblk0p28 ,这个分区就是userdata所在分区!
參考本人的转并补充内容的还有一篇文章《add_partition 函数学习》
可知,/dev/block/mmcblk0pxx 这些分区是依据gpt内容而创建,因此怀疑gpt内容错误,导致user分区没有被成功创建。
root@zxx/ # cd dev/block/
root@zxx:/dev/block # ls
mmcblk0
mmcblk0p1
mmcblk0p10
mmcblk0p11
mmcblk0p12
mmcblk0p13
mmcblk0p14
mmcblk0p15
mmcblk0p16
mmcblk0p17
mmcblk0p18
mmcblk0p19
mmcblk0p2
mmcblk0p20
mmcblk0p21
mmcblk0p22
mmcblk0p23
mmcblk0p24
mmcblk0p25
mmcblk0p26
mmcblk0p27
// mmcblk0p28 正常开机的有p28分区
mmcblk0p3
mmcblk0p4
mmcblk0p5
mmcblk0p6
mmcblk0p7
mmcblk0p8
mmcblk0p9
mmcblk0rpmb
三、
使用dd命令,从mmc设备mmcblk0中将gpt数据读取出来,正常开机、和无法开机的都读取一份。
四、 使用二进制比較工具hexcmp对照两份gpt的内容,主要异常有两处,例如以下两图:
从图中能够能够看到gpt headergpt header CRC 及 partition array CRC不同,First LBA、Last LBA不同。
例如以下图:
下图是partiton array 内容的比較。从图中能够看到userdata分区的end lba不同。
无法开机的gpt内容与默认build出来的gpt_main0.bin比較 ,发现userdata分区的end lba居然和build出来的是相等的。
userdata分区是整个emmc的最后一分区,不同的emmc size最后一个分区的end lba是build阶段无法知道的。因此build的仅仅是一个默认值。
必须由下载工具自己主动更新该lba值。
四、
从上面的分析能够知道QPST emmc software download 工具没有更新userdata end lba。或者更新失败。
那么,怎样证明是工具没有写这个lba?还是写失败?或者写的是错误的内容?
使用winhex工具,从无法开机的gpt内容中将gpt header 和 gpt partition arrary 的内容分别截取出来。
使用AS-CRC32.EXE 工具。分别对gpt header 和 gpt partition array 的内容计算出crc。工具例如以下图:
通过对照crc。计算机出的crc的无法开机的gpt header中的两个crc都是相等的。
因此,能够证明,gpt中的userdata end 并不是是写入失败,或者没有写入。
而是QPST emmc software download 工具定稿的错误的内容。
结论: 由上分析,能够证明是QPST emmc software download 工具的问题。
五、
解决方式建议。
更新QPST的软件版本号,最新版本号支持一个新的使用firehose协议的下载工具:QFIL,
取代QPST emmc software download 。QFIL更稳定,更好用。例如以下图:
參考:
80-N7350-1_B_GUID_Partition_Tables_Programming.pdf
UEFI_2_4_Errata_B.pdf
版权声明:本文博主原创文章,博客,未经同意不得转载。
相关文章
- 故障分析 | Redis Cluster 分片内存异常使用不均问题诊断
- Django(50)drf异常模块源码分析
- Java基础入门笔记05——面向对象,创建对象的内存分析,继承,封装,多态,object类,this&&super,方法重写,引用类型的强制转换,instanceof,抽象类,内部类,接口,异常。[通
- EasyPlayer播放H.265的HLS视频流出现加载异常的问题分析及解决方法
- 宝塔版面异常监控推送---使用教程
- 异常的出现情况及解决方式(持续更新中)
- Flutter异常监控 | 框架Catcher原理分析
- Flutter异常捕获 | 从bugsnag源码学习如何追溯异常产生路径
- 关于外传宝塔面板或Nginx异常简单分析
- kubernetes关于eks一次异常问题的复盘
- AI动作异常行为分析监测系统
- Python异常处理机制结构详解
- MySQL: 解决数据库异常问题.(mysql异常)
- Oracle数据库的01427异常揭示分析(oracle-01427)
- Oracle主键数据异常分析与处理(oracle主键数据异常)
- 异常深入探索Redis集群中主节点异常现象分析(redis集群显示主节点)
- Redis存储系统用于跟踪异常日志的分析(redis记录异常日志)
- IIS6.0出错脚本引擎异常处理方法