高通QFIL 导出所有分区
目錄
導(dǎo)出為一個(gè)partition.bin的方案
導(dǎo)出所有分區(qū)的方案
導(dǎo)出為一個(gè)partition.bin的方案
通常QFIL下載的xml,我們使用高通提供的ptool工具(本人之前的文章中有提到)生成的rawprogram0_BLANK_GPT.xml可以派上用場,另外需要普及一個(gè)簡單的概念
program?在高通的xml配置中表示下載;
read?表示讀取.
<?xml version="1.0" ?> <data><!--NOTE: This is an ** Autogenerated file **--><!--NOTE: This file writes a VALID but EMPTY partition table to sector 0 **--><!--NOTE: Sector size is 512bytes--><program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="gpt_empty0.bin" label="PrimaryGPT" num_partition_sectors="33" partofsingleimage="false" physical_partition_number="0" readbackverify="false" size_in_KB="16.5" sparse="false" start_byte_hex="0x0" start_sector="0"/> </data>我們想備份dump整個(gè)emmc的數(shù)據(jù),下面幾個(gè)點(diǎn)需要關(guān)注:
關(guān)于flash的總大小,QFIL工具可以很容易的讀取出,但是需要注意,機(jī)器切換至EDL模式后,先load一個(gè)和該設(shè)備對(duì)應(yīng)的firmware的版本,然后
比如,當(dāng)前我這邊設(shè)備的總block數(shù)是0x747c000,16進(jìn)制換算為10進(jìn)制數(shù)為?122142720此處就代表整個(gè)flash的sectors扇區(qū)
而根據(jù)xml的配置
我們的num_partition_sectors =?122142720
?單位 SECTOR_IN_BYTES為512Byte,所以,我們對(duì)應(yīng)的flash總大小size_in_KB?
(122142720 *?512)/1024 =?122142720/2 =?61071360KB
于是,我們最后得到的dump整個(gè)emmc為一個(gè)鏡像的二進(jìn)制文件配置
<?xml version="1.0" ?> <data><!--NOTE: This is an ** Autogenerated file **--><!--NOTE: Sector size is 512bytes--><read SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="partition.bin" label="PrimaryGPT" num_partition_sectors="122142720" physical_partition_number="0" size_in_KB="61071360.0" sparse="false" start_byte_hex="0x0" start_sector="0"/> </data>接下來主要是一樣選擇patch0.xml及漫長的等待讀取過程.
2. 高通gpt分區(qū)表的格式和算法
SECTOR_SIZE_IN_BYTES="512"? 每個(gè)扇區(qū)的字節(jié)數(shù),flash的type為emmc一般是512,之前做過的的UFS項(xiàng)目為4096
filename="partition.bin" 分區(qū)的名稱
num_partition_sectors="122142720"? 分區(qū)的總扇區(qū)數(shù)
size_in_KB="61071360.0" 分區(qū)的實(shí)際大小,單位為KB
sparse="false" 是否以打散的方式read或program
start_byte_hex="0x0" 起始地址
start_sector 起始扇區(qū)
通常情況下,有分區(qū)表前提下,對(duì)于dump flash數(shù)據(jù)而言,基本需要計(jì)算的主要是sectors或者是實(shí)際的大小即可.
通常 下一分區(qū)的start_sector - 上一分區(qū)的start_sector = 上一分區(qū)的num_partition_sectors
導(dǎo)出所有分區(qū)的方案
對(duì)于所有分區(qū)導(dǎo)出,稍微比oneimage麻煩一些,
1. 需要原始的未被打散的rawprogram0.xml
2. 所有分區(qū)的filename都必須填充,只要是partition.xml里的分區(qū),都要加上
A/B分區(qū)的填寫相應(yīng)的a/b?鏡像,非A/B的直接bak鏡像,總而言及就是filename?不能空.
3. 最重要的userdata大小的計(jì)算
方便說明,我上傳了處理項(xiàng)目對(duì)應(yīng)的計(jì)算舉例,
- 以sectors的計(jì)算如下:
讀取的sectors數(shù),從上面我們通過QFIL拿到了sector數(shù)為122142720
userdata的扇區(qū)數(shù)?為 122142720-33-21758464?=?100384223
<program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="userdata.img" label="userdata" num_partition_sectors="100384223" partofsingleimage="false" physical_partition_number="0" programbackverify="false" size_in_KB="50192112.0" sparse="false" start_byte_hex="0x298040000" start_sector="21758464"/><program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="gpt_main0.bin" label="PrimaryGPT" num_partition_sectors="34" partofsingleimage="true" physical_partition_number="0" programbackverify="false" size_in_KB="17.0" sparse="false" start_byte_hex="0x0" start_sector="0"/><program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="gpt_backup0.bin" label="BackupGPT" num_partition_sectors="33" partofsingleimage="true" physical_partition_number="0" programbackverify="false" size_in_KB="16.5" sparse="false" start_byte_hex="(512*NUM_DISK_SECTORS)-16896." start_sector="NUM_DISK_SECTORS-33."/>size_in_KB = (100384351 * 512) / 2 =?50192111.5KB
- 以讀取partition方式計(jì)算:
adb shell
ls -al /dev/block/by-name/userdata
lrwxrwxrwx 1 root root 21 1970-01-01 08:41 /dev/block/by-name/userdata -> /dev/block/mmcblk0p87
cat /proc/partitions?查看對(duì)應(yīng)blk的大小
cat /proc/partitions | grep mmcblk0p87
259 ? ? ? 55 ? 50192111 mmcblk0p87
50192111KB即是userdata對(duì)應(yīng)size的大小.
發(fā)現(xiàn)了一個(gè)小問題,以sector計(jì)算的大小實(shí)際是50192111.5,但讀取partition的值是50192111,最終填了50192111.5,然后導(dǎo)出的usserdata大小50192112KB.
總結(jié)
以上是生活随笔為你收集整理的高通QFIL 导出所有分区的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows中VS卸载opencv配置
- 下一篇: 安卓——launchMode