Устройство NVRAM в UEFI-совместимых прошивках, часть первая

Checking nvram что делать

Отказ от ответственности

Не смея нарушать уже устоявшуюся традицию, вынужден написать, что все сведения, которые вы тут можете почерпнуть, могут привести при неосторожном или неправильном использовании к разрушению ваших NVRAM, прошивки, системы и веры в человечество. Автор не несет ответственности вообще ни за что, используйте полученные знания на свой страх и риск, делайте зарядку, хорошо кушайте и больше спите.

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

Введение

Начнем с того, что вообще такое эта NVRAM и зачем она вдруг понадобилась авторам спецификации UEFI, с учетом того, что до этого все спокойно пользовались для хранения своих настроек CMOS SRAM на батарейке и не жужжали. О «логическом» уровне NVRAM я уже рассказывал немного, а здесь постараюсь рассказать подробнее о «физическом».
Итак, NVRAM — это такая специальная область данных, в которой хранятся те UEFI-переменные, у которых установлен атрибут Non-Volatile. Самые популярные переменные такого рода — это Setup, в которой хранится большая часть текущих настроек из BIOS Setup, BootXXXX/BootOrder/BootNext, управляющие порядком загрузки, PK/KEK/db/dbx/dbt, отвечающие за работу SecureBoot, MonotonicCounter, защищающий от replay-атак на предыдущую пятёрку, и множество других, конкретный список зависит от вендора, модели платы и версии её прошивки.

Чаще всего NVRAM располагают на том же SPI-чипе, что и исполняемый код прошивки, по одной простой и банальной причине — это практически бесплатно (ибо 100-200 Кб на чипе емкостью в 8 Мб можно найти почти всегда, а отдельная микросхема CMOS SRAM на 128 Кб стоит весьма ощутимых денег). Бесплатность эта приводит к нескольким весьма серьезным рискам:

  1. Если в драйвере NVRAM есть ошибка, то он может разрушить не только свои данные, но и данные соседей, в том числе и том, в котором хранится код, тогда после перезагрузки машина встанет колом, и восстановить её из такого состояния будет весьма непросто.
  2. Каждая запись в NVRAM (а их обычно делают несколько при каждом включении и каждой перезагрузке) снижает ресурс SPI-чипа, и при некоторых условиях (к примеру, при постоянно высокой температуре, что не редкость для промышленных ПК) уже через 3-5 лет ресурс этот полностью вырабатывается и система начинает вести себя очень странно. При этом никаких аналогов SMART, EXT_CSD или автоматического wear-out leveling’а производители SPI-чипов 25-ой серии не предоставляют, и я уже пару раз видел системы, на которых чип просто «устал» до полной неработоспособности и его пришлось менять.
  3. Невозможно сбросить разрушенный или неправильный NVRAM перемычкой или выниманием батарейки, нужно стирание при помощи внешнего по отношению к хранилищу SPI-устройства. Некоторое производители имитируют поведение привычного пользователям джампера CLEAR_CMOS при помощи специального DXE-драйвера, храня в CMOS SRAM (которая до сих пор есть, но теперь она значительно меньше, т.к. хранятся в ней только часы и пара флагов) флаг NVRAM_IS_VALID. Если при следующей загрузке флаг этот оказывается сброшен, то выполняется восстановление значений по умолчанию для переменных вроде Setup. К сожалению, очень часто это не помогает, т.к. до загрузки этого драйвера была целая фаза PEI, в которой тоже были модули с запросами к NVRAM, и если запросы удовлетворить не получилось — то и восстановить ничего не выйдет, ибо загрузка прекратится раньше.

Требования к NVRAM

При реализации «физического» уровня NVRAM производителям прошивок пришлось решать множество вопросов: как обеспечить быстрый доступ к переменным на чтение (читаются они во время загрузки достаточно активно), как снизить нагрузку на флеш-память при записи, как хранить переменные таким образом, чтобы не дублировать общие для нескольких переменных данные (vendor GUID’ы, к примеру), как восстановить хотя бы часть данных после сбоя, и так далее. При этом, предложенный Intel при выпуске стандарта EFI 1.10 формат хранилища данных NVRAM оказался хоть и простым, но удовлетворяющим далеко не всем вышеперечисленным требованиям, плюс его формат не был описан в спецификации UEFI PI , т.е. выбор реализации NVRAM оставили конечным вендорам.

Какие бывают форматы

Прежде, чем говорить о форматах, поговорим немного об их названиях. Каждый вендор, следуя давней традиции назвать свою страну «страной» или «землей», а её народ — «людьми», называет свой формат «форматом хранения NVRAM», что несколько мешает их различать. Но нам повезло: т.к. NVRAM обычно хранится внутри специального тома с относительно произвольной структурой, то у заголовков хранилищ имеются сигнатуры, и эти сигнатуры у каждого формата оказались разными. Вот по сигнатурам я их и буду называть, хотя эта терминология еще не устоялась.

Первым исторически и по распространенности оказался предложенный Intel на заре развития EFI формат VSS, который в стандарте UEFI 2.3.1C был расширен для поддержки защищенных переменных, используемых для реализации SecureBoot, а также получил пару расширений от компании Apple, используемых только в их прошивках. Рядом с данными в формате VSS может храниться блок FTW , данные из которого помогают восстановить NVRAM в случае аварийно неоконченной записи (помните, что «питание компьютера можно отключить» в любую секунду). После внедрения SecureBoot понадобилось хранить значения по умолчанию для его переменных, для чего некоторые вендоры добавили к тому же формату блок FDC (тоже названный по сигнатуре), где эти «умолчания» и хранятся.

Почти сразу оказалось, что хранить NVRAM исключительно формате VSS вовсе не обязательно, поэтому кто-то из вендоров (не знаю точно, кто был первым, по моему это был Phoenix) реализовал ему на замену формат EVSA, в котором появилась дедупликация GUID’ов и имен переменных, зато пропали возможности FTW. Формат это не получил особого распространения, но иногда все же нет-нет, да встречается в старых прошивках времен UEFI 2.1. Для своих хранилищ EVSA используют те же самые основной и дополнительный тома NVRAM, что и VSS, поэтому разбор структуры этих томов, как я уже говорил, занятие весьма увлекательное.

В Apple пошли еще дальше, и добавили в те же многострадальные тома еще два блока данных — SVS, формат которого совпадает с обычным VSS с точностью до сигнатуры, и Fsys, формат которого в Apple придумали с нуля.

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

Формат VSS и его вариации

Данные NVRAM во всех виденных мной UEFI-совместимых прошивках, кроме основанных на коде AMI (о которых я расскажу в части, посвященной формату NVAR), хранятся в одном или нескольких томах с GUID FFF12B8D-7696-4C8B-A985-2747075B4F50 (он же EFI_SYSTEM_NV_DATA_FV_GUID, я его называю «основным»), либо с GUID 00504624-8A59-4EEB-BD0F-6B36E96128E0 (его я называю «дополнительным»).
Оба тома имеют разреженную структуру, поэтому приходится просматривать их байт за байтом в поисках сигнатур хранилищ и блоков. Заголовок хранилища VSS выглядит следующим образом:
Не все пока еще умеют разбирать структуры языка C на лету, поэтому есть смысл показать ту же самую структуру на скриншоте:

Легко видно, что перед нами заголовок хранилища VSS с соответствующей сигнатурой , общим размером 0xFFB8 байт, правильно отформатированное и с верными данными .
Apple иногда использует такой же заголовок, но с другой сигнатурой — $SVS. Зачем так сделано — не знаю, think different, видимо.
Сразу после заголовка хранилища начинаются хранящиеся в нем переменные. Располагаются они друг за другом, и на всех архитектурах, кроме IA64 (она же Itanium), для которой упоминается требование выравнивания начала переменных по восьмибайтовой границе, но у меня просто нет образов прошивок для этой архитектуры, чтобы проверить это утверждение.

Форматов переменных за десятилетнюю историю VSS накопилось три штуки: старый, использовавшийся до UEFI 2.3.1C, его расширение от Apple с дополнительным полем для CRC32, и новый, внедрение которого потребовалось для поддержки SecureBoot. Возможно, есть еще какие-то другие, но найти образы с ними мне пока не удалось, может быть у читателей получится.

Standard

Этот формат широко использовался практически всеми производителями UEFI-совместимых прошивок, кроме AMI, в течение лет примерно семи, пока не потребовалось внедрение SecureBoot. Заголовок «стандартной» переменной выглядит так:
На этот раз на скриншноте можно показать сразу несколько переменных:

Точнее говоря, полторы: PchInit и часть Setup . Они имеют состояние 0x7F (VARIABLE_HEADER_VAL >атрибуты 0x07 (NV +BS +RT ), длину имени 0x10 и 0x0C, длину данных 0x04 и 0x2B0, и GUID E6C2F70A-B604-4877-85BA-DEEC89E117EB и 4DFBBAAB-1392-4FDE-ABB8-C41CC5AD7D5D соответственно.

Если вручную разбирать ничего не хочется, можно воспользоваться последней альфа-версией UEFITool NE, из него том NVRAM со скриншотов выше выглядит так:

Apple CRC

Примерно пару лет назад в Apple решили, что их переменным не хватает контрольной суммы, и поэтому добавили к заголовку выше еще одно поле, в котором хранится CRC32-контрольная сумма блока данных переменной. Этот формат Apple использует по сей день, и, скорее всего, продолжит использовать в будущем. Заголовок его выглядит вот так:
Скриншоты прикладывать не буду, там все совершенно по аналогии, скажу только, что Apple использует дополнительный атрибут 0x80000000 (CRC_USED), чтобы отличать свой заголовок от стандартного.

Authenticated

После того, как UEFI Forum принял решение использовать NVRAM для хранения ключей, используемых технологией SecureBoot, понадобилась доработка формата. Новые переменные получили заголовок следующего вида:
На скриншоте такая переменная выглядит примерно так:

Маркер тот же, что и у обычных переменных, состояние в данном случае 0x3F (VARIABLE_ADDED), атрибуты — 0x27 (BS+NV+RT+TA ), счетчик не задействован, зато задействована временная метка в формате EFI_TIME, индекс в БД публичных ключей также не задействован, размер имени — 0x08, размер данных — 0x64D, GUID — D719B2CB-3D3A-4596-A3BC-DAD00E67656F, а зовут эту переменную dbx.

В UEFITool эта же переменная выглядит вот так:

Введение

Начнем с того, что вообще такое эта NVRAM и зачем она вдруг понадобилась авторам спецификации UEFI, с учетом того, что до этого все спокойно пользовались для хранения своих настроек CMOS SRAM на батарейке и не жужжали. О «логическом» уровне NVRAM я уже рассказывал немного, а здесь постараюсь рассказать подробнее о «физическом».
Итак, NVRAM — это такая специальная область данных, в которой хранятся те UEFI-переменные, у которых установлен атрибут Non-Volatile. Самые популярные переменные такого рода — это Setup, в которой хранится большая часть текущих настроек из BIOS Setup, BootXXXX/BootOrder/BootNext, управляющие порядком загрузки, PK/KEK/db/dbx/dbt, отвечающие за работу SecureBoot, MonotonicCounter, защищающий от replay-атак на предыдущую пятёрку, и множество других, конкретный список зависит от вендора, модели платы и версии её прошивки.

  1. Если в драйвере NVRAM есть ошибка, то он может разрушить не только свои данные, но и данные соседей, в том числе и том, в котором хранится код, тогда после перезагрузки машина встанет колом, и восстановить её из такого состояния будет весьма непросто.
  2. Каждая запись в NVRAM (а их обычно делают несколько при каждом включении и каждой перезагрузке) снижает ресурс SPI-чипа, и при некоторых условиях (к примеру, при постоянно высокой температуре, что не редкость для промышленных ПК) уже через 3-5 лет ресурс этот полностью вырабатывается и система начинает вести себя очень странно. При этом никаких аналогов SMART, EXT_CSD или автоматического wear-out leveling’а производители SPI-чипов 25-ой серии не предоставляют, и я уже пару раз видел системы, на которых чип просто «устал» до полной неработоспособности и его пришлось менять.
  3. Невозможно сбросить разрушенный или неправильный NVRAM перемычкой или выниманием батарейки, нужно стирание при помощи внешнего по отношению к хранилищу SPI-устройства. Некоторое производители имитируют поведение привычного пользователям джампера CLEAR_CMOS при помощи специального DXE-драйвера, храня в CMOS SRAM (которая до сих пор есть, но теперь она значительно меньше, т.к. хранятся в ней только часы и пара флагов) флаг NVRAM_IS_VALID. Если при следующей загрузке флаг этот оказывается сброшен, то выполняется восстановление значений по умолчанию для переменных вроде Setup. К сожалению, очень часто это не помогает, т.к. до загрузки этого драйвера была целая фаза PEI, в которой тоже были модули с запросами к NVRAM, и если запросы удовлетворить не получилось — то и восстановить ничего не выйдет, ибо загрузка прекратится раньше.

Способы восстановления

Перед началом процесса восстановления рекомендуется зарядить смартфон хотя бы на 50%, лучше – полностью. Неважно, каким способом будет проводиться возврат утерянного файла, эта процедура занимает некоторое время и нельзя, чтобы телефон разрядился.

Восстановление из резервной копии

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

Рекомендуется сохранять файл резервной копии на ПК, чтобы не потерять его при записи новой ОС на смартфоне.

Восстановление NVRAM из сделанной резервной копии:

  1. Запустить приложение восстановления на телефоне;
  2. Подключить смартфон к ПК через USB;
  3. Включить доступ Root на смартфоне;
  4. Нажать кнопку Restore/Восстановить;
  5. Следовать указаниям системы на устройстве.

Внешний вид меню и действия пользователя могут незначительно изменяться на разных устройствах и операционных системах.

Через TWRP Recovery

Приложение TWRP Recovery бесплатное, устанавливается непосредственно на смартфон. TWRP Recovery позволяет проводить восстановление всей системы или отдельных частей, в том числе, NVRAM.

  1. Запустить приложение;
  2. Войти в меню «Restore»;
  3. Найти нужный вариант резервной копии;
  4. Выбрать разделы, которые пользователь хочет восстановить;
  5. Подтвердить выбор.

Через SP Flash Tool

Программа предназначена для работы с прошивкой устройства. Скачать SP Flash Tool можно на официальном сайте разработчика.

Необходимо подключить смартфон к ПК с установленной утилитой по USB:

  1. Запустить SP Flash Tool;
  2. Найти телефон программой;
  3. Перейти во вкладку «Write Memory»;
  4. В разделе File Path указать путь к файлу с NVRAM;
  5. Нажать кнопку записи в память;
  6. Перепрошить смартфон заводским вариантом ОС.

Через терминал

Скачиваем терминал. Далее следовать алгоритму:

  1. Скинуть файл терминала на телефон;
  2. Файл NVRAM также положить на устройство, в корневую папку, присвоить разрешение img;
  3. Получить доступ к Root правам;
  4. Ввести последовательно команды: «su», «dd if=/sdcard/nvram.img of=/dev/nvram»;
  5. Перезагрузить устройство.

Через MTK Android Tools

Утилита скачивается и устанавливается на компьютер. Для восстановления необходимо, чтобы именно в MTK Android Tools создавался бэкап. Алгоритм возврата файла:

  1. Установить Root права на телефоне;
  2. Подключить смартфон к ПК;
  3. Включить отладку USB;
  4. Запустить MTK Android Tools.

Должно получиться также, как на скрине.

Нажать кнопку Root, подтвердить выбор на все запросы утилиты.

По завершению работы MTK Android Tools рекомендуется перезагрузить устройство.

При помощи ADB

Небольшая утилита скачивается и устанавливается на компьютер.

Алгоритм работы с утилитой ADB схож с предыдущими вариантами. Необходимо подключить смартфон к ПК, указать путь к файлу NVRAM и нажать кнопку Root.

Для работы с утилитой на телефоне должны быть установлены Root права.

Если резервной копии нет

Не всякий пользователь достаточно предусмотрителен, чтобы сделать бэкап до установки прошивки. Если копии важного файла нет, существуют способы восстановления без нее.

Использование патча

Специальный патч создан для восстановления NVRAM.

Далее следует алгоритм:

  1. Установить архив в память телефона, пользуясь одной из перечисленных выше программ, например, TWRP;
  2. В режиме рекавери на смартфоне найти файл с названием «Patch IMEI Fixing», запустить его;
  3. Дождаться завершения установки.

Важное примечание: пользоваться патчем рекомендуется только в тех случаях, когда на этом смартфоне больше не будут устанавливаться прошивки. С каждой последующей установкой NVRAM будет слетать.

Программа SN Write Station Tool

Программа бесплатная. Устанавливается на ПК, со смартфоном работает по USB подключению. SN Write Station Tool предназначена для восстановления IMEI.

Лучше всего совместима с Windows 7, на других операционных системах может работать нестабильно.

IMEI&SN Writer

Необходимо скачать и установить утилиту на компьютер. Далее:

  1. Подключить смартфон к ПК;
  2. Установить в IMEI&SN Writer подключение (поставить галку на USB);
  3. Выбрать разделы для восстановления во вкладке Write Litem;
  4. Нажать большую кнопку START для запуска восстановления.

Программы Maui Meta 3G и SP META

В утилитах присутствуют специальные разделы по восстановлению NVRAM на смартфонах. Программы устанавливаются на компьютер, работа со смартфоном ведется через подключение USB.

Обе утилиты имеют интуитивно понятный интерфейс, работают по схожем принципу.

Запуск восстановления на Maui Meta.

При любом из вариантов рекомендуется устанавливать Root права на смартфоне. Пользователям следует аккуратнее подбирать прошивки для телефонов и программы для отката настроек.

При правильном использовании качественного ПО потери данных не произойдет.

Проблема времени в компьютере

Микросхема RTC на материнской плате

В первых компьютерах не было микросхемы RTS (Real Time Clock, часы реального времени).

Это было неудобно, и потом ее начали устанавливать.

Проблема, которая возникла с RTC в самом начале, заключалась в том, что компьютер работает не 24 часа в сутки. Он включается пользователем в начале рабочего дня и выключается в его конце. Пока компьютер был включен, он «помнил» время, как только его выключали, он время «забывал».

Каждый раз устанавливать время заново было бы очень неудобно. Неудобно было бы и каждый раз возобновлять и другие системные настройки (тип винчестера, источник загрузки и другие). Поэтому придумали встроить в общий корпус микросхему RTC, которая помнила не только время, но и все настройки BIOS Setup, и источник питания – батарею гальванических элементов.

Ячейки памяти RTC представляли собой, по сути, оперативную память (RAM). Такую память также отнесли к энергонезависимой, так как она не зависела от источника внешнего напряжения. Она была энергонезависимой до тех пор, пока встроенная батарея не «садилась». Такая память была сделана на основе КМОП структур, поэтому потребляла в статическом режиме (режиме хранения) очень небольшой ток, порядка единиц микроампер.

Поэтому встроенной батареи хватало на несколько лет. После чего весь модуль подлежал замене. Существовали конструкции материнских плат с разъемом под такой модуль. И можно было легко выполнить его замену. Но затем технический прогресс продолжил свой неумолимый бег. Число микросхем на материнской плате уменьшалось, а степень их интеграции увеличивалась.

Микросхема чипсета

В конце концов пришли к чипсету (набору микросхем), состоящему из 1-2 корпусов, который включал в себя почти все подсистемы материнской платы.

Встраивать в тот же корпус (куда напихано уже много всего) еще и источник напряжения посчитали нецелесообразным.

Такой корпус имеет много выводов. Установка его в разъем усложнила бы конструкцию, увеличила бы ее стоимость и снизила бы надежность.

Поэтому источник питания (3 V литиевый элемент) стали устанавливать отдельно. Это упростило и удешевило плату, так как теперь надо менять только элемент, а не все сразу. Следует отметить, что вначале в качестве источника резервного питания использовались никель-кадмиевые аккумуляторы.

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

Технология изменилась, но название структуры, хранящей настройки BIOS Setup, осталось прежним – NVRAM. Но теперь, в строгом смысле, она не является энергонезависимой. Ведь ее «энергонезависимость» обеспечивается внешним источником напряжения.

Напомним, что первым признаком того, что элемент 2032 исчерпал свой ресурс, является сброс времени и даты при включении компьютера. Напряжение свежего элемента составляет величину около 3,3 В. По мере истощения его ЭДС падает. И, как только оно снизится (ориентировочно) менее 2,8 В, структура, хранящая настройки, «забудет» их. Заряду литиевые элементы не подлежат.

Оцените статью
Fobosworld.ru
Добавить комментарий

Adblock
detector