Разделы флеша#
Layout флеша большой Капсулы на RK3308 (SLC NAND Toshiba, 218 МБ, 447 488 секторов). Данные - из полных дампов сообщества. Размер раздела = разница LBA × 512 байт.
NAND доступен хосту не напрямую, а через слой трансляции FTL (SFTL, суперблок - в конце NAND): хост читает/пишет логические LBA, лоадер отображает их в NAND. Поэтому дамп - логический (GPT LBA), а не raw NAND.
Флеш-чип (Capsule-14)#
| Чип | Toshiba TC58NVG1S3HTA00, TSOP48, SLC, 2 Гбит (256 МБ, ~218 МБ доступно) |
| ID | 98 da 90 15 77 16 |
| Интерфейс | 8-битная параллельная шина к rknand-контроллеру RK3308 (не SPI!), страница 2 КиБ + OOB |
| Обвязка | шина через резисторы ~22 Ом; WP#/CE# - подтяжки 4,7 кОм, R/B# - 10 кОм |
Встречалась и плата с 128 МБ RAM + NAND 1 Гбит (flash ID 98 f1) -
редкая ревизия.
LBA 0..8191: idblock (4 МиБ)#
Вся область до первого раздела GPT. Логически: заголовок IDB и GPT - в начале, затем зеркало idbloader (TPL - DDR init + подписанный usbplug/u-boot):
| Диапазон LBA | Содержимое |
|---|---|
0x0000..0x0004 |
заголовок IDB |
0x0001..0x0021 |
GPT (header + 128 entries) |
0x0040..0x0158 |
копия №1 idbloader |
0x0440..0x0558 |
копия №2 (шаг 0x400 секторов = 512 КиБ) |
0x0840..0x0958 |
копия №3 |
0x0C40..0x0D58 |
копия №4 |
0x1040..0x1158 |
копия №5 |
0x1159..0x2000 |
нули |
Физически idblock хранится 6 копиями в NAND-блоках 0–11; логический
адрес - LBA 64 (байт 0x8000). Запись разделов через wl идёт через
FTL и физический idblock не трогает; штатный способ перезаписать idblock -
rkdeveloptool ul <loader> (upgrade-loader). Прямая запись idblock по
LBA - известный способ окирпичить плату (рассинхрон SFTL): не делать.
GPT-разделы (LBA 8192..447454)#
Нумерация в Linux: /dev/rkflash0p1..p11.
| # | Раздел | LBA (start–end) | Размер | Назначение |
|---|---|---|---|---|
| p1 | uboot |
8192–16383 | 4 МиБ | u-boot (формат «LOADER », miniloader-flow) |
| p2 | trust |
16384–24575 | 4 МиБ | ARM Trusted Firmware BL31 |
| p3 | misc |
24576–26623 | 1 МиБ | bootloader message (BCB + копия DTB) |
| p4 | boot_a |
26624–59599 | 16,1 МиБ | ANDROID!-boot: ядро 4.4.167 + initramfs + resource.img |
| p5 | boot_b |
59600–92575 | 16,1 МиБ | то же, слот B |
| p6 | system_a |
92576–180639 | 43 МиБ | squashfs (xz, 128K), dm-verity |
| p7 | system_b |
180640–268703 | 43 МиБ | |
| p8 | vbmeta_a |
268704–270751 | 1 МиБ | AVB0 (Android Verified Boot 1.1) |
| p9 | vbmeta_b |
270752–272799 | 1 МиБ | |
| p10 | security |
272800–280991 | 4 МиБ | заводская безопасность, пер-платная |
| p11 | userdata |
280992–447454 | 81,3 МиБ | не подписан, ext2/ext4, /data |
LBA 447455..447487 (33 сектора) - вторичная копия GPT.
Что важно знать#
10_securityпер-платный. Образ с другой платы не переносится; любые изменения раздела необратимы.userdataне подписан - единственный раздел, который можно свободно перезаписывать; на этом построен userspace-джейлбрейк.- ext4 в mainline-прошивке - без журнала: жёсткие ресеты поверх
смонтированного RW-оверлея портят ФС - перед ресетом
umount /dataили пауза на sync. - Vendor storage в LBA-пространстве отсутствует: доступ только
спецопкодами rockusb READ/WRITE_VENDOR_STORAGE (
0x27/0x26) или магическим LBA0xfff00001(SN). На наблюдавшихся платах пуст. - Лимит чтения usbplug - 32 МиБ (маска 0xCC). Заводской лоадер
отдаёт константу
0xCCвместо данных дляboot_b, system_a/b, vbmeta_a/b, security, userdata; честно читаются толькоuboot, trust, misc, boot_a(+ зеркало idblock). Обход - RAM-патч предела чтения в usbplug, без записи во флеш: см. librerd. Маска ≠ бэкап: перезапись замаскированного раздела без реального дампа - безвозвратная потеря. - GPT-GUID'ы генерируются лоадером на сессию (между сессиями отличаются), layout при этом стабилен - запись по LBA от GUID не зависит.
TODO: layout мини-плат и Amlogic-мини (UBI + вендорская ECC).