Boot ROM — это часть постоянной памяти (ROM), которая используется для загрузки компьютерной системы. [1] Она содержит инструкции, которые выполняются после сброса ЦП на вектор сброса , и обычно загружает загрузчик . Существует два типа boot ROM: загрузочное ROM с маской , которое не может быть изменено впоследствии, и перезаписываемое boot ROM, такое как EEPROM или чип флэш-памяти .
При включении питания оборудование обычно запускается неинициализированным. Для продолжения загрузки системе может потребоваться прочитать загрузчик с какого-либо периферийного устройства. Часто бывает проще реализовать процедуры чтения с внешних устройств хранения в программном обеспечении, чем в аппаратном обеспечении. Загрузочное ПЗУ предоставляет место для хранения этого начального кода загрузки в фиксированном месте, которое сразу же становится доступным процессору при запуске выполнения.
This section needs additional citations for verification. (October 2022) |
Загрузочное ПЗУ отображается в памяти в фиксированном месте, и процессор спроектирован так, чтобы начинать выполнение с этого места после сброса, в соответствии с вектором сброса процессора . Загрузочное ПЗУ либо размещается на том же кристалле, что и ЦП, либо представляет собой внешнюю микросхему ПЗУ . В современных системах загрузочное ПЗУ (встроенное в ЦП или внешнюю микросхему ПЗУ) обычно использует флэш-память NOR , которая поддерживает выполнение на месте .
Затем загрузочное ПЗУ инициализирует аппаратные шины и периферийные устройства, необходимые для загрузки. В некоторых случаях загрузочное ПЗУ способно инициализировать ОЗУ , а в других случаях это должен сделать загрузчик . [ необходима цитата ]
В конце инициализации оборудования загрузочное ПЗУ попытается загрузить загрузчик с внешнего периферийного устройства (например, жесткого диска или твердотельного накопителя , карты eMMC или eUFS , карты microSD , внешнего EEPROM и т. д.) или через определенный протокол (протоколы) на порту связи (например, последовательном порте или Ethernet и т. д.).
Во многих системах на чипе периферийные устройства или шины, с которых загрузочное ПЗУ пытается загрузить загрузчик, и порядок, в котором они загружаются, могут быть сконфигурированы. Эта конфигурация может быть выполнена путем пережигания некоторых электронных предохранителей внутри системы на чипе для кодирования этой информации или путем установки определенных контактов или перемычек системы на чипе в высокий или низкий уровень.
Некоторые загрузочные ПЗУ способны проверять цифровую подпись загрузчика и откажутся запускать загрузчик и остановят загрузку, если подпись недействительна или не была подписана авторизованным ключом. В некоторых загрузочных ПЗУ хэш открытого ключа, необходимый для проверки подписей, закодирован в электронных предохранителях внутри системы на чипе . Некоторые загрузочные ПЗУ системы на чипе также поддерживают инфраструктуру открытых ключей , и хэш открытого ключа центра сертификации (CA) закодирован в электронных предохранителях вместо этого, и загрузочное ПЗУ затем сможет проверить, подписан ли загрузчик авторизованным ключом, проверив этот ключ с помощью открытого ключа CA (чей хэш закодирован в электронных предохранителях ). [2] [3]
Эту функцию затем можно использовать для реализации функций безопасности или использовать в качестве аппаратного корня доверия в цепочке доверия , но после настройки пользователи лишаются свободы заменять загрузчик на тот, который они хотят. Из-за этого функция вызвала серьезную обеспокоенность у сообщества свободного программного обеспечения. [4]
Перед тем как перейти к загрузчику, некоторые системы на чипе также удаляют загрузочное ПЗУ из отображения памяти, в то время как другие этого не делают, что позволяет сбросить загрузочное ПЗУ для последующего анализа. [3] Если загрузочное ПЗУ все еще видно, загрузчики также могут вызывать код загрузочного ПЗУ (что иногда документируется).
Когда система на чипе (SoC) переходит в режим ожидания в ОЗУ , во многих случаях процессор полностью отключается, а ОЗУ переходит в режим самообновления. При возобновлении работы загрузочное ПЗУ выполняется снова, и многие загрузочные ПЗУ способны обнаружить, что SoC находилась в режиме ожидания в ОЗУ, и могут возобновить работу, перейдя непосредственно к ядру , которое затем позаботится о повторном включении периферийных устройств, которые были выключены, и восстановлении состояния, в котором компьютер находился до этого.
Во многих системах Allwinner на чипе (A10, A20, A64) загрузочное ПЗУ либо ждет загрузки загрузчика через USB (если определенный PIN-код высок), либо пытается загрузить несколько периферийных устройств в фиксированном порядке. [5]
Некоторые системы Allwinner на чипе могут проверять подпись загрузчиков. [6] Но большинство выпускаемых устройств не настроены на это. Это позволило бесплатному и открытому программному обеспечению добавить поддержку для многих систем Allwinner на чипе и устройств, использующих их в загрузчиках, таких как U-Boot . [7]
На устройствах iPhone , iPad , Apple Watch , iPod Touch и Apple TV загрузочное ПЗУ называется «SecureROM» [8] Это урезанная версия iBoot . Она обеспечивает механизм обновления прошивки устройства (DFU), который можно активировать с помощью специальной комбинации кнопок. [9]
Загрузочное ПЗУ систем на кристалле (SOC) NXP поддерживает настройку периферийных устройств через определенные контакты системы на кристалле. В семействе i.MX6 также поддерживается настройка порядка загрузки через efuses .
Загрузочное ПЗУ некоторых систем на кристалле NXP имеет множество способов загрузки загрузчика первой ступени (с eMMC, microSD, USB и т. д.).
Несколько SoC NXP можно настроить на проверку подписи загрузчиков. Многие устройства с такими SoC продавались без настроенной проверки, и на этих устройствах пользователи могут установить желаемый загрузчик , включая несколько бесплатных и открытых загрузчиков программного обеспечения, таких как Das U-Boot [10] и Barebox .
Загрузочные ПЗУ нескольких систем на чипе Texas Instruments поддерживают настройку периферии через определенные контакты системы на чипе. Они имеют много способов загрузки загрузчика первой стадии (который в справочных руководствах по системам на чипе называется MLO):
В системе OMAP36xx на чипе загрузочное ПЗУ ищет загрузчик первой ступени в секторах 0x0 и 0x20000 (128 КБ), [ 11] а в системе AM3358 на чипе [12] оно дополнительно ищет в секторах 0x40000 (256 КБ) и 0x60000 (384 КБ). В обоих случаях его максимальный размер составляет 128 КБ. Это связано с тем, что загрузчик (первой ступени) загружается в SRAM , которая находится внутри системы на чипе.
Системы OMAP и AM335x на чипе могут быть настроены на проверку подписи загрузчиков. Многие устройства с такой системой на чипе продавались без настроенной проверки, и на этих устройствах пользователи могут установить желаемый загрузчик, включая несколько бесплатных и открытых программных загрузчиков, таких как Das U-Boot [13] и Coreboot [14] и Barebox .
Микроконтроллеры семейства STM32 компании STMicroelectronics имеют встроенное ПЗУ (также называемое «встроенным ПЗУ») и включают системную память [15] для облегчения прошивки пустой системы. Определенные комбинации выводов или иногда сбои и/или проверки пустой флеш-памяти заставляют чип загружаться из ПЗУ вместо прошивки в основной флеш-памяти. Это позволяет прошивать пустые чипы, не прибегая к интерфейсам аппаратного программирования. Технически это ПЗУ хранится в выделенной области массива флеш-памяти и программируется ST во время производства. Большинство микроконтроллеров STM32 можно, по крайней мере, прошивать через UART, некоторые поддерживают USB и, в конечном итоге, другие интерфейсы, такие как, например, I2C , SPI или CAN . Ядро Cortex-M обычно извлекает векторы из известных адресов 0x00000000 (начальное значение указателя стека ) и 0x00000004 (начальное значение счетчика программ ). Однако выводы и/или предохранители определяют, какая память отображается по этим адресам. Системная память — один из вариантов отображения, другой обычно будет основной прошивкой во флэш-памяти. В этом случае прошивка должна выполнять все задачи, которые выполняют загрузочные ПЗУ; часть прошивки может действовать как загрузчик, аналогичный загрузочному ПЗУ ST. Аппаратное обеспечение может обеспечить принудительное использование только чтения в области загрузки, превращая ее в пользовательскую версию загрузочного ПЗУ.
На устройствах под управлением iOS для взлома iOS иногда используются эксплойты boot ROM (например, limera1n, [16] alloc8, [17] и checkm8 [8] [16] ) . Преимущество для людей, желающих взломать свои устройства, перед эксплойтами, влияющими на iOS, заключается в том, что поскольку boot ROM не может быть изменен, а устройства под управлением iOS не имеют предохранителей для добавления кода в boot ROM, Apple не может исправить уязвимость на существующих устройствах.
Загрузочное ПЗУ Tegra SoC от Nvidia (используемое Nintendo Switch ) содержало уязвимость, которая позволяла пользователям запускать желаемый ими загрузчик . [18] [19]