Найти в Дзене
Allsafe ;)

Дамп NAND Amlogic или почему просто так нельзя взять и отредактировать байты дампа

Оглавление

Иногда получал вопросы о том, что можно ли отредактировать данные в дампе NAND и записать их назад в устройство. Например что бы починить загрузчик, повреждение которого случается периодически при обновлениях Яндекс колонок. В процессе изучения программного обеспечения ТВ боксов и колонок на базе процессоров Amlogic я получил часть ответов на эти вопросы и хочу поделится этими знаниями.

Организация памяти

Начну с минимального описания организации хранения данных в NAND.Описывать полностью принципы работы NAND памяти я не буду, достаточно знать что это не самые надежные устройства хранения, которые с завода имеют поврежденные блоки. Для контроля правильности данных придуманы специальные алгоритмы, при работе они размещают в памяти NAND служебную информацию, назову упрощенно ecc не вдаваясь в подробности пока. Что бы понять где хранятся эти служебные данные требуется разобраться со структурой памяти NAND. Все пространство делится на физические страницы например 2 или 4 Кб, микросхема может читать и писать только такими страницами, да что бы заменить 1 байт управляющий контроллер читает 2 Кб , меняет 1 байт , пересчитывает есс, стирает страницу и записывает 2 Кб назад. Размер физической страницы можно узнать в документации на микросхему NAND.

Выдержка из документации
Выдержка из документации

Документация при этом сообщает , что на 2Кб данных (2048 байт) страница дополнительно имеет 64 байта для размещения служебной информации (oob). Поэтому реальный физический размер блока читаемых/записываемых данных будет 2112 байт ( для приведенного примера), из таких страниц вся память и складывается.

Расположение блоков данных в памяти Nand
Расположение блоков данных в памяти Nand

Контроль ошибок (ЕСС)

ECC - специальная контрольная сумма позволяющая определить битовые ошибки памяти NAND и частично их исправить (несколько бит) . Если количество бит превысит порог, то блок считается поврежденным, информация передвигается в другой блок и делается пометка в таблице Плохих Блоков (Bad Blocks).

Изменение любого бита в области субстраницы или user data(см.ниже) должны сопровождаться пересчетом есс иначе будет считаться что это ошибочный бит или весь блок.

Хранится ecc в областях oob. Некоторые микросхемы Nand могут самостоятельно производить контроль ошибок и пересчитывают есс, но для универсальности производители возлагают эти функции на свое ПО, Amlogic не исключение. Опишу строение страниц памяти которые используют Amlogic.Страницы разбиваются на субстраницы состоящие из 512 байт данных, 2 байта называемые user data, 14 байт ecc (user data+ecc это oob), всего длинна 528 байт. На скриншоте ниже выделен блок 2 байта 0x55AA, и 14 байт ecc.

Еще есть такое понятие как виртуальная страница, например физическая страница 2 Кб разбита на виртуальные страницы по 1 Кб, каждая виртуальная разбита на субстраницы по 512 байт (без учета oob).

Пример блока служебной информации Amlogic
Пример блока служебной информации Amlogic

User data - используется Amlogic для пометки области памяти, например :

  • 0x55AA - область занимамемая bootloader (bl2)
  • 0xFFFF - в области ubi разделов маркер что страница пригодна

Алгоритмы пересчета

Некоторую информацию о алгоритме рачета есс можно получить из U-boot, приводится 7 возможных вариантов:

0.AML_ECC_BCH8 / ecc_page = 512

1.AML_ECC_BCH8_1K / ecc_page = 1024

2.AML_ECC_BCH24_1K

3.AML_ECC_BCH30_1K

4.AML_ECC_BCH40_1K

5.AML_ECC_BCH50_1K

6.AML_ECC_BCH60_1K / ecc_page = 1024

Из названия видно что применяется один из БЧХ (BCH) алгоритмов, ecc_page - обозначает размер виртуальной страницы которой оперирует Amlogic. К сожалению многих важных подробностей в исходниках U-boot нет, т.к. расчеты производит периферия микропроцессора. Определение параметров возможно, подробное описание будет приведено в следующих статьях.

Итог

При изменении любого бита блока данных (512+2 байта) требуется произвести перерасчет ecc. Ситуация усложняется если блок данных находится в файловой системе или имеет дополнительные контрольные суммы. Например в разделе ubifs правка данных требует обновления CRC, после производится перерасчет ecc всех затронутых изменениями блоков. Если перерасчет есс не произвести, то алгоритм контроля ошибок вернет поправленный бит в прежнее состояние или пометит блок как плохой, при превышении определенного порога ошибок.

Все это усложняет правку дампов вручную через hex редактор, требуется разработка утилит ( готовых я не видел ) или применение программаторов поддерживающих алгоритмы Amlogic, такие имеются, например UFPI. Программное обеспечение таких программаторов самостоятельно производит все необходимые перерасчеты.