ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

高通QFIL dump 整个flash镜像

2021-07-24 12:34:14  阅读:794  来源: 互联网

标签:xml partition sectors dump QFIL flash 122142720 分区


目录

导出为一个partition.bin的方案

导出所有分区的方案


导出为一个partition.bin的方案

通常QFIL下载的xml,我们使用高通提供的ptool工具(本人之前的文章中有提到)生成的rawprogram0_BLANK_GPT.xml可以派上用场,另外需要普及一个简单的概念

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整个emmc的数据,下面几个点需要关注:

  1. emmc的总大小

关于flash的总大小,QFIL工具可以很容易的读取出,但是需要注意,机器切换至EDL模式后,先load一个和该设备对应的firmware的版本,然后

比如,当前我这边设备的总block数是0x747c000,16进制换算为10进制数为 122142720此处就代表整个flash的sectors扇区

而根据xml的配置

我们的num_partition_sectors = 122142720

 单位 SECTOR_IN_BYTES为512Byte,所以,我们对应的flash总大小size_in_KB 

(122142720 * 512)/1024 = 122142720/2 = 61071360KB

于是,我们最后得到的dump整个emmc为一个镜像的二进制文件配置

<?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分区表的格式和算法

SECTOR_SIZE_IN_BYTES="512"  每个扇区的字节数,flash的type为emmc一般是512,之前做过的的UFS项目为4096

filename="partition.bin" 分区的名称

num_partition_sectors="122142720"  分区的总扇区数

size_in_KB="61071360.0" 分区的实际大小,单位为KB

sparse="false" 是否以打散的方式read或program

start_byte_hex="0x0" 起始地址

start_sector 起始扇区

通常情况下,有分区表前提下,对于dump flash数据而言,基本需要计算的主要是sectors或者是实际的大小即可.

通常 下一分区的start_sector - 上一分区的start_sector = 上一分区的num_partition_sectors

导出所有分区的方案

对于所有分区导出,稍微比oneimage麻烦一些,

1. 需要原始的未被打散的rawprogram0.xml

2. 所有分区的filename都必须填充,只要是partition.xml里的分区,都要加上

A/B分区的填写相应的a/b 镜像,非A/B的直接bak镜像,总而言及就是filename 不能空.

3. 最重要的userdata大小的计算

方便说明,我上传了处理项目对应的计算举例,

  • 以sectors的计算如下:

读取的sectors数,从上面我们通过QFIL拿到了sector数为122142720

userdata的扇区数 为 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方式计算:

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 查看对应blk的大小

cat /proc/partitions | grep mmcblk0p87

259       55   50192111 mmcblk0p87

50192111KB即是userdata对应size的大小.

发现了一个小问题,以sector计算的大小实际是50192111.5,但读取partition的值是50192111,最终填了50192111.5,然后导出的usserdata大小50192112KB.

标签:xml,partition,sectors,dump,QFIL,flash,122142720,分区
来源: https://blog.csdn.net/jeephao/article/details/119043451

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有