zoukankan      html  css  js  c++  java
  • 高通公司 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



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength 属性设置的值。
    PowerDesigner 连接数据库,更新数据库;
    Spark Worker启动Driver和Executor工作流程
    获取spark-submit --files的文件内容
    JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别(转)
    在Java应用中通过SparkLauncher启动Spark任务
    通过thriftserver的beeline/jdbc等方式连接到SparkSQL
    Spark:java.net.BindException: Address already in use: Service 'SparkUI' failed after 16 retries!
    Spark Sql之ThriftServer和Beeline的使用
    Spark SQL读取Oracle的number类型的数据时精度丢失问题
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4875714.html
Copyright © 2011-2022 走看看