高通平台如何正确设置userdata分区的大小

1. 问题描述:

在开发高通平台的android机型时,遇到了UFS芯片实际使用的是64G容量的存储芯片,但在android系统中的“设置>>存储>>存储大小”中看到却是16G,导致andriod系统仅能使用这16G进行运行,而无法使用实际的64G,本文针对此现象做了总结记录。

2. 解决方法:

2.1 两处代码修改

1、在amss的partition.xml中配置GROW_LAST_PARTITION_TO_FILL_DISK=true

2、在BoardConfig.mk中设置BOARD_USERDATAIMAGE_PARTITION_SIZE=“Left-over size” - 16KB

       Left-over size的含义是:实际总空间大小  -  已经分配出去的大小

       16K:数据加密功能使用分区的最后16KB来存储用于加密的raw footer

2.2 参数可通过下面步骤计算得出:

  • 先执行一次恢复出场设置,即可将存储芯片上的实际用户空间临时释放出来
  • cat /proc/partitions,找出data分区的大小,作为“Left-over size”

       BOARD_USERDATAIMAGE_PARTITION_SIZE=“Left-over size” - 16KB

2.2.1 恢复出场设置前:

df -h
Filesystem       Size  Used Avail Use% Mounted on
tmpfs            2.7G  1.2M  2.7G   1% /dev
tmpfs            2.7G     0  2.7G   0% /mnt
/dev/block/sda13  11M  160K   11M   2% /metadata
/dev/block/dm-4  826M  823M  2.5M 100% /
/dev/block/dm-5  207M  207M  644K 100% /system_ext
/dev/block/dm-6  588M  587M  1.8M 100% /vendor
/dev/block/dm-7  168M  167M  516K 100% /product
tmpfs            2.7G     0  2.7G   0% /apex
tmpfs            2.7G  264K  2.7G   1% /linkerconfig
/dev/block/sde4  140M   36M  104M  26% /vendor/firmware_mnt
/dev/block/sde9   27M   24M  3.6M  87% /vendor/dsp
/dev/block/sda2   27M  764K   26M   3% /mnt/vendor/persist
/dev/block/sde5   64M  736K   63M   2% /vendor/bt_firmware
/dev/block/dm-8   10G  518M  9.4G   6% /data
tmpfs            2.7G     0  2.7G   0% /data_mirror
/data/media       10G  518M  9.4G   6% /mnt/runtime/default/emulated
/dev/fuse         10G  518M  9.4G   6% /mnt/user/0/emulated

2.2.2 恢复出场设置后:

console:/ # df -h                                                    
Filesystem       Size  Used Avail Use% Mounted on
tmpfs            2.7G  1.2M  2.7G   1% /dev
tmpfs            2.7G     0  2.7G   0% /mnt
/dev/block/sda13  11M  144K   11M   2% /metadata
/dev/block/dm-4  826M  823M  2.5M 100% /
/dev/block/dm-5  207M  207M  644K 100% /system_ext
/dev/block/dm-6  696M  694M  2.1M 100% /vendor
/dev/block/dm-7  168M  167M  516K 100% /product
tmpfs            2.7G     0  2.7G   0% /apex
tmpfs            2.7G  264K  2.7G   1% /linkerconfig
/dev/block/sde4  140M   36M  104M  26% /vendor/firmware_mnt
/dev/block/sde9   27M   24M  3.6M  87% /vendor/dsp
/dev/block/sda2   27M  764K   26M   3% /mnt/vendor/persist
/dev/block/sde5   64M  736K   63M   2% /vendor/bt_firmware
/dev/block/dm-8   49G  1.2G   48G   3% /data
tmpfs            2.7G     0  2.7G   0% /data_mirror
/data/media       49G  1.2G   48G   3% /mnt/runtime/default/emulated
/dev/fuse         49G  1.2G   48G   3% /mnt/user/0/emulated

cat /proc/partitions
major minor  #blocks  name
 ...
 ...
 253        0     860372 dm-0
 253        1     216056 dm-1
 253        2     174708 dm-2
 253        3     725436 dm-3
 253        4     846708 dm-4
 253        5     212564 dm-5
 253        6     713908 dm-6
 253        7     171868 dm-7
 253        8   51457868 dm-8       //由df -h可知data分区为dm-8

3. 代码提交参考

--- a/device/qcom/sm6150/BoardConfig.mk
+++ b/device/qcom/sm6150/BoardConfig.mk
@@ -145,7 +145,8 @@ TARGET_USERIMAGES_USE_EXT4 := true
 TARGET_USERIMAGES_USE_F2FS := true
 BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := f2fs
 BOARD_BOOTIMAGE_PARTITION_SIZE := 0x04000000
-BOARD_USERDATAIMAGE_PARTITION_SIZE := 10737418240
+#BOARD_USERDATAIMAGE_PARTITION_SIZE := 10737418240
+BOARD_USERDATAIMAGE_PARTITION_SIZE := 52692824064
 BOARD_PERSISTIMAGE_PARTITION_SIZE := 33554432
 BOARD_METADATAIMAGE_PARTITION_SIZE := 16777216
 BOARD_DTBOIMG_PARTITION_SIZE := 0x0800000

(本文原创地址为: 高通平台如何正确设置userdata分区的大小-CSDN博客  转载请注明出处)

以下是一个简单的高通8295芯片的分区代码,其中包含了一些物理分区的信息,用于控制设备的分区行为。这个代码使用了GPT分区表,其中包含了一些基本的分区,如boot、recovery、system、userdata等等。此外,代码中还包含了一些附加分区,如cache、persist、misc等等。请注意,这只是一个简单的示例,实际的分区代码可能会更复杂和详细。 ``` #define SECTOR_SIZE 512 #define PARTITION_TABLE_SIZE 34 * SECTOR_SIZE struct partition_entry { uint8_t partition_guid[16]; uint64_t starting_lba; uint64_t ending_lba; uint64_t attributes; uint16_t partition_name[36]; }; struct partition_table { uint64_t signature; uint32_t revision; uint32_t header_size; uint32_t crc32; uint32_t reserved; uint64_t current_lba; uint64_t backup_lba; uint64_t first_usable_lba; uint64_t last_usable_lba; uint8_t disk_guid[16]; uint64_t partition_entry_lba; uint32_t num_partition_entries; uint32_t sizeof_partition_entry; uint32_t partition_entry_array_crc32; struct partition_entry partition_entries[128]; }; int main() { struct partition_table gpt = {0}; gpt.signature = 0x5452415020494645ULL; gpt.revision = 0x00010000; gpt.header_size = 92; gpt.current_lba = 1; gpt.backup_lba = 65535; gpt.first_usable_lba = 34; gpt.last_usable_lba = 65502; memcpy(gpt.disk_guid, "\x8f\x00\x00\x00\x00\x00\x10\x00\x80\x00\x00\xaa\x00\x38\x9b\x71", 16); gpt.partition_entry_lba = 2; gpt.num_partition_entries = 128; gpt.sizeof_partition_entry = 128; // boot partition struct partition_entry boot = {0}; memcpy(boot.partition_guid, "\x40\x0c\x52\x6a\x8d\x4e\x4f\x5d\x84\x65\x5a\x3e\x3f\xbd\x6c\x3f", 16); boot.starting_lba = 34; boot.ending_lba = 1601; boot.attributes = 0; memcpy(boot.partition_name, L"boot", 8 * sizeof(wchar_t)); gpt.partition_entries[0] = boot; // recovery partition struct partition_entry recovery = {0}; memcpy(recovery.partition_guid, "\x9e\x6d\xc5\x8e\x3b\x3d\x4a\x4b\x9f\x6a\x92\x9d\x8b\xfa\x8a\x13", 16); recovery.starting_lba = 1602; recovery.ending_lba = 3137; recovery.attributes = 0; memcpy(recovery.partition_name, L"recovery", 16 * sizeof(wchar_t)); gpt.partition_entries[1] = recovery; // system partition struct partition_entry system = {0}; memcpy(system.partition_guid, "\x7a\x26\x8c\x2e\x5d\x91\x4c\x45\xa1\x4b\x7e\x69\xb6\x6f\x1f\x9f", 16); system.starting_lba = 3138; system.ending_lba = 44289; system.attributes = 0; memcpy(system.partition_name, L"system", 12 * sizeof(wchar_t)); gpt.partition_entries[2] = system; // userdata partition struct partition_entry userdata = {0}; memcpy(userdata.partition_guid, "\xc5\x9a\x34\xd2\x64\x4d\x4c\x4d\x80\x0b\x67\xc0\x5c\x1b\xf3\x96", 16); userdata.starting_lba = 44290; userdata.ending_lba = 65502; userdata.attributes = 0; memcpy(userdata.partition_name, L"userdata", 14 * sizeof(wchar_t)); gpt.partition_entries[3] = userdata; // cache partition struct partition_entry cache = {0}; memcpy(cache.partition_guid, "\xbf\x0a\x1b\x2e\xd2\x1d\x4c\x4f\xa6\xdb\x2a\xef\x43\x7c\xdf\x3b", 16); cache.starting_lba = 3138; cache.ending_lba = 3377; cache.attributes = 0; memcpy(cache.partition_name, L"cache", 10 * sizeof(wchar_t)); gpt.partition_entries[4] = cache; // persist partition struct partition_entry persist = {0}; memcpy(persist.partition_guid, "\x6d\x55\x8e\xea\x6f\x36\x4c\x4d\xbb\x1c\x95\x7d\x5c\x5b\x12\x45", 16); persist.starting_lba = 3378; persist.ending_lba = 3649; persist.attributes = 0; memcpy(persist.partition_name, L"persist", 12 * sizeof(wchar_t)); gpt.partition_entries[5] = persist; // misc partition struct partition_entry misc = {0}; memcpy(misc.partition_guid, "\x5d\x07\x7d\x41\x6c\x77\x4e\x4f\xa9\x5e\x9c\x7d\x5c\x5b\x12\x45", 16); misc.starting_lba = 3650; misc.ending_lba = 3777; misc.attributes = 0; memcpy(misc.partition_name, L"misc", 8 * sizeof(wchar_t)); gpt.partition_entries[6] = misc; // write partition table to disk FILE* fp = fopen("/dev/block/mmcblk0", "wb"); fwrite(&gpt, 1, PARTITION_TABLE_SIZE, fp); fclose(fp); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫特踏实

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值