Иногда получал вопросы о том, что можно ли отредактировать данные в дампе NAND и записать их назад в устройство. Например что бы починить загрузчик, повреждение которого случается периодически при обновлениях Яндекс колонок. В процессе изучения программного обеспечения ТВ боксов и колонок на базе процессоров Amlogic я получил часть ответов на эти вопросы и хочу поделится этими знаниями.
Организация памяти
Начну с минимального описания организации хранения данных в NAND.Описывать полностью принципы работы NAND памяти я не буду, достаточно знать что это не самые надежные устройства хранения, которые с завода имеют поврежденные блоки. Для контроля правильности данных придуманы специальные алгоритмы, при работе они размещают в памяти NAND служебную информацию, назову упрощенно ecc не вдаваясь в подробности пока. Что бы понять где хранятся эти служебные данные требуется разобраться со структурой памяти NAND. Все пространство делится на физические страницы например 2 или 4 Кб, микросхема может читать и писать только такими страницами, да что бы заменить 1 байт управляющий контроллер читает 2 Кб , меняет 1 байт , пересчитывает есс, стирает страницу и записывает 2 Кб назад. Размер физической страницы можно узнать в документации на микросхему NAND.
Документация при этом сообщает , что на 2Кб данных (2048 байт) страница дополнительно имеет 64 байта для размещения служебной информации (oob). Поэтому реальный физический размер блока читаемых/записываемых данных будет 2112 байт ( для приведенного примера), из таких страниц вся память и складывается.
Контроль ошибок (ЕСС)
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).
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. Программное обеспечение таких программаторов самостоятельно производит все необходимые перерасчеты.