Как стать автором
Обновить

Комментарии 22

Давненько я не брал в руки шашек не писал длинных русских текстов, если найдете очепятку — пишите в Л/С, постараюсь исправить.
Спасибо за познавательную статью. А очепяток не заметил;)

Кстати, а структуры просто для наглядности или это реальные куски кода? Если реальные, то как обстоят дела с выравниванием и паковкой полей?


А за статью — спасибо! Всегда интересно почитать про форматы на железе — подучивает нейронную сеть в мозгу, потом помогает при анализе каких-то данных или просто отладки. Но из статьи я не понял: как была построен сам процесс разбора? Т.е. результат вижу: такой-то формат, такие-то данные, а как происходило понимание какие поля чему соответствуют, какие флаги ставятся в полях флагов и так далее.

Совершенно реальные, а по суффиксам в именах даже можно догадаться, с каких систем взяты.
Про выравнивание переменных я упоминал, там его нет во всех случаях, кроме гипотетического IA64, но я реальных образов с таких машине не видел, только сборки QEMU + TianoCore, там выравнивание есть и оно по восьмибайтовой границе. По упаковке — все пакуется наиболее плотно.
Разбор происходит следующим образом: если есть доступ к машине, то можно получить имена, GUIDы, аттрибуты и данные переменных, просто читая их последовательным вызовом UEFI runtime — функций GetNextVariableName и GetVariable. В итоге половина данных уже есть и их можно затем найти в дампе, остается угадать формат заголовков и значения некоторых аттрибутов, тут помогает открытый код проектов TianoCore, CHIPSEC, плюс некоторые добрый люди в сообществе, вроде тов. xvilka, иногда делятся своими соображениями или даже кодом.
Если же доступа нет, то либо стоит им разжиться, либо просишь дампы прошивки и вывод команды dmpstore и играешь в угадайку по ним.
Отличная статья.
P.S. По поводу опечаток заметил в начале:«я написал ПАРУ статей о форматах данных», правильно будет «написал НЕСКОЛЬКО статей», так как ПАРА применяется преимущественно «Две штуки чего-либо», а 3 — уже «несколько».
Это такой каламбур неудачный про то, что там были части первая, полуторная, и вторая. Я согласен с тем, что «три — это куча, а два — это не куча», но оставлю так.
Ждем продолжения.
Спасибо. Было время, умудрился пару раз убить материнскую плату своего ноута с прошивкой на основе Insyde. Зато разобрался во всей этой теме, собрал нужный инструментарий и добился желаемого эффекта (разлочки скрытых меню setup utility и изменения таблицы температур задающих скорость вращения кулера в прошивке EC). Кажется был 2009-2010 год и прошивку приходилось потрошить с помощью скриптов на python и slic tool, т.к. нормальный инструментарий отсутствовал в паблике или еще не был написан. Ну и скриншоты из Hex Dump (или как называется этот софт?) навевают ностальгию, тоже визуализировал структуры с помощью цветных областей.
Всегда пожалуйста.
У меня тоже мое увлечение (переросшее потом в работу) началось со сломанной материнской платы, прошивка которой просто перестала стартовать после очередного обновления. Пришлось покупать прошитый чип на Ебее, но оказалось, что в этом чипе нет данных SMBIOS, и некоторый достаточно дорогой софт после замены отказался признать систему своей. Пришлось разбираться с восстановлением данных, по результату была написана утилита FD44Editor, потом пришлось соорудить комплект для прошивания (FTK), т.к. стандартные утилиты ASUS меня не устраивали, потом я устал от сложностей с PhoenixToot и сел писать собственный велосипед, и все заверте…
Софт этот называется HxD, это один из самых простых и маленьких хекс-редакторов для Windows с GUI. Есть гораздо более продвинутые редакторы вроде 010 Editor или WinHex, но мне хватало и этого всегда.

UINT8 State; // Состояние переменной

Какой физический смысл у поля "состояние переменной"? Зачем это? Как интерпретировать? Какие там допустимые значения?

https://github.com/tianocore/edk2/blob/7c0ad2c33810ead45b7919f8f8d0e282dae52e71/MdeModulePkg/Include/Guid/VariableFormat.h#L97

#define VAR_IN_DELETED_TRANSITION  0xfe     ///< Variable is in obsolete transition.
#define VAR_DELETED                0xfd     ///< Variable is obsolete.
#define VAR_HEADER_VALID_ONLY      0x7f     ///< Variable header has been valid.
#define VAR_ADDED                  0x3f     ///< Variable has been completely added.

Физический смысл: отделить валидные переменные от тех, которые пока еще не валидные (запись еще не закончена или была прервана по каким-то причинам) и тех, которые перестали быть валидными (в переменную было записано новое значение, а старое еще не убрали).

Как интерпретировать: https://github.com/tianocore/edk2/blob/7c0ad2c33810ead45b7919f8f8d0e282dae52e71/MdeModulePkg/Universal/Variable/RuntimeDxe/VariableParsing.c

Каков, собственно, алгоритм, который из SPI- NOR Flash делает NVRAM?
Что про это можно почитать?

Не понял вопроса такой постановке. По поводу того, какие дополнительные фичи простого Non-Volatile Storage сделают его полноценной NVRAM - вот здесь писал.

Неужели чтобы выполнить GetVariableByName(Name) надо просканировать все 16MByte SPI NOR Flash чипа, чтобы найти самый актуальный заголовок с Name?

Нет, конечно, под переменные выделяется несколько блоков и драйвер NVRAM получает информацию об их адресе и размере из Platform Configuration Database (PCD). Вот эти конкретные значения во время работы машины не меняются, и потому могут быть типа PcdsFixedAtBuild, т.е. фактически константами, которые сборочная система захардкодит прямо в сам драйвер при сборке.

Внутри нынешнего хранилища - да, каждый раз надо проходить с первой переменной до последней, поэтому на некоторых платформах еще и в оперативной памяти заводят копию, чтобы оттуда значения возвращать, а не читать их каждый раз с медленного флеша. Писать же приходится сразу, потому что никаких возможностей отложенной записи у UEFI нет (и слава яйцам!).

Вот подали питание. Как прошивка найдёт конец NVRAM? Всю SPI NOR Flash память с конца просмотрит что ли?
Всё 16MByte байтик за байтиком на 0xFF проверит?

Зачем искать конец NVRAM? Он задан константой в прошивке при сборке.

Зачем искать конец NVRAM? Он задан константой в прошивке при сборке.

Я имел в виду конец заполненной части NVRAM.
Однако я уже разобрался и написал про это отдельный текст

NVRAM Поверх off-chip SPI-NOR Flash
https://habr.com/ru/articles/732442/

поидее это надо делать лишь при старте контроллера, само значение и адрес свободной ячейки хранятся в RAM и при сбое питания могут быть восстановлены, то что это делается достаточно долго, это может быть не столь заметным на фоне времени сброса и инициализации, а дальше всё необходимое хранится в RAM и не надо каждый раз искать свободное место.

У меня вопрос в том как из SPI-NOR flash микросхем сделать программный интерфейс как у SD-карт?

В SD-картах можно спокойно читать, писать, стирать блоки фиксированной длинны по 512 байт, обращаясь по номеру блока.

Хоть один блок писать 1000k раз подряд. В SD-картах на аппаратном уровне выполняется механизм равномерного износа Flash.

Если есть интерфейс SD-карт, то можно спокойно пристегивать FatFs и создавать текстовые файлики как на PC.

Очень просто - добавить контроллер. Только вот ньюансы.... контроллер может писать, стирать блоки по 512 байт, а вот flash-чип нет, он умеет стирать скажем только страницами по 12кБ, поэтому контроллеру надо как-то выкручиваться и ИГНОРИРОВАТЬ команды стирания блоков, до тех пор пока не освободится целая страница.
Насколько я знаю, равномерный износ ячеек придумали только с развитием SSD-дисков, а флеш-карты гораздо более примитивны, и системы выравнивания износа там нет - собственно это причина того что удалённые/поврежденные данные с карт памяти можно восстановить, а вот с SSD-диска через несколько часов ваши "свободные данные" могут быть оптимизированы алгоритмами равномерного износа(сектора с актуальной информацией могут быть перегруппированы в другие страницы без изменения их виртуального адреса) и от них не останется и следа. По этой причине, область FAT на флеш-картах выполнена по старой SLC-технологии, выдерживающей износ в 100К-1М перезаписей, а остальной объем по более тонкой технологии с гораздо меньшим ресурсом. Быввают ещё разного рода резервы, с закрытой прошивкой контроллеры, которые иммитируют многие функции за счет увеличенного объема - например карта памяти на 1Гб если разобрать будет состоять из контроллера и ДВУХ чипов по 8Гбит, что нетрудно догадаться их суммарный объём будет составлять - 2Гб, а карта на 1... и одному китаю ведома как там работает прошивка и как используется этот объём для увеличения ресурса, а может и чипы битые и из двух едва наскребли на половину их суммарного объема рабочих страниц.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации