標籤:style blog http color 使用 os io 資料
問題分析步驟如下:
一、
MSM8916平台gpt機率性問題:使用QPST emmc software download工具下載完軟體後,無法開機。如:
log分析是userdata分區沒有成功mount 。
二、
adb shell ls /dev/block 顯示,開機失敗的機器,比正常開機的機器少一個分區:mmcblk0p28 ,這個分區就是userdata所在分區!
參考本人的轉並補充內容的另一篇文章《add_partition 函數學習》
可知,/dev/block/mmcblk0pxx 這些分區是根據gpt內容而建立,因此懷疑gpt內容錯誤,導致user分區沒有被成功建立。
[email protected]/ # cd dev/block/
[email protected]:/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