Для исправления ошибок BIOS на ноутбуке, прежде всего, стоит перезагрузить устройство и войти в меню BIOS, обычно нажав клавишу F2, Delete или Esc при запуске. В настройках BIOS можно проверить и восстановить заводские установочные параметры, что может помочь устранить возникшие проблемы.
Если проблема сохраняется, рекомендуем обновить BIOS до последней версии, которую можно скачать с сайта производителя. Обновление поможет устранить известные ошибки и улучшить совместимость с оборудованием. Однако следует быть осторожным: неправильное выполнение этой процедуры может привести к дополнительным сбоям в работе устройства.
Коды ошибок BIOS и инструкции по их исправлению
Вероятно, многие пользователи компьютеров сталкивались с одним или несколькими звуковыми сигналами, которые издают динамики материнской платы сразу после запуска устройства. Если ПК работает исправно, при его включении обычно слышен один или (иногда) два коротких сигнала. Однако если сигналов становится больше, и компьютер или система Windows отказываются загружаться, это может указывать на первые проявления неисправности оборудования или программного обеспечения. Как действовать в такой ситуации? Давайте разберемся в этом вопросе.
Откуда берутся звуковые сигналы?
Современные материнские платы оснащены микропрограммой BIOS, о которой можно узнать больше в данной статье. Она управляет последовательностью активации электронных компонентов на системной плате, что в итоге обеспечивает успешный запуск всего компьютера.
В случае возникновения проблемы с каким-либо встроенным устройством или внешним оборудованием, подключенным к материнской плате, BIOS подает звуковые сигналы, предупреждая о неисправности. Аналогичная ситуация наблюдается, если сбой загрузки компьютера вызван программными ошибками в самой микропрограмме BIOS.
По количеству, характеру (длинный/короткий) и последовательности издаваемых сигналов можно определить, какое из устройств ПК дает сбой. Причем один и тот же вид неисправности на разных моделях (версиях) BIOS может кодироваться по-своему. Рассмотрим звуковые коды ошибок самых распространенных моделей BIOS.
Определяем версию BIOS
Для определения версии BIOS в операционных системах Windows выполните следующие шаги:
- Откройте меню "Пуск" и выберите опцию "Выполнить" или используйте сочетание клавиш "Win+R".
- В появившемся окошке введите команду "msinfo32" и нажмите "ОК".
- Запустится утилита "Сведения о системе".
- В центральной зоне найдете раздел с таблицей и ищите строку "Версия BIOS".
- В столбце "Значение" напротив этого пункта будет указана версия вашего BIOS, как показано на следующем изображении.
В приведенном выше примере версия BIOS выглядит как "American Megatrends Inc. P2.70, 10.09.2012" или "AMI BIOS". Далее рассмотрим возможные ошибки AMI BIOS, а также две другие широко распространенные версии микропрограмм — Award и Phoenix BIOS.
Ошибки AMI BIOS
Когда возникают проблемы с BIOS от компании "American Megatrends Inc.", пользователь может обнаружить несколько коротких или длинных звуковых сигналов, а также их комбинации.
Звуковой сигнал
Описание ошибки
Предлагаемое решение ситуации
Ошибка четности RAM может быть связана с тем, что в настроечных параметрах BIOS задано слишком низкое значение задержки для чтения данных из оперативной памяти
В первом случае может помочь перестановка планки ОЗУ в другой слот либо их очистка их контактов от загрязнений. При неправильно выставленных значениях задержки помогает сброс настроек BIOS. Если не помогает, ОЗУ придется заменить.
Не удалось считать информацию из первых 64 КБ оперативной памяти.
Способ решения аналогичен приведённому ранее.
Неисправность системного таймера: возможно, что проблема связана с питанием микросхемы CMOS, неисправностями блока питания или материнской платы
В случае, если батарея, отвечающая за питание CMOS, разряжена, ее следует заменить. В других ситуациях может потребоваться профилактическое обслуживание, ремонт или замена источника питания или материнской платы.
Неисправность центрального процессора
Удалите процессор, продуйте контактную площадку, затем установите его на место. Если это не решает проблему, необходимо заменить центральный процессор.
Неисправности материнской платы
Выполнить комплексную профилактику компьютера. Если это не дает результатов, стоит рассмотреть замену материнской платы.
Проблемы с оперативной памятью видеоадаптера (RAM)
Извлечь видеоадаптер, очистить от пыли его и слот материнской платы, в который устанавливается видеокарта. Заменить видеоадаптер, если не мероприятия не помогут.
Необходимо перезагрузить данные микросхемы BIOS (неверная контрольная сумма)
Попробуйте выполнить аппаратный сброс настроек BIOS. Если это не решит проблему, микросхему потребуется заменить, что возможно только в сервисном центре.
Ошибка при попытке BIOS записать данные в память CMOS
Аналогичное решение, как и ранее.
Проблема с кэш-памятью на материнской плате
Вероятнее всего, потребуется замена материнской платы.
1 длинный и 1 короткий
Проблема с блоком питания
Необходимо извлечь блок питания и провести его техническое обслуживание. Если это не решит проблему, придется либо отремонтировать, либо заменить блок питания.
1 длинный, 2 или 3 коротких
Обслуживание видеокарты или ее заменяющее действие.
1 длительный сигнал и 4 коротких сигнала
Видеокарта не подключена
Демонтировать видеокарту, удалить загрязнения с контактов и очистить разъем материнской платы. Если это не решает проблему — установить новую видеокарту.
1 длинный, 8 коротких
Проблема с видеокартой или монитор не подключен.
Выполнить профилактику видеокарты. Проверить кабель монитора. Возможно, его придется заменить.
Нет сигнала, экран не стартует
Аппаратная ошибка центрального процессора
Выполнить профилактику процессора. Заменить ЦПУ, если не помогает.
Постоянный звуковой сигнал
Проблемы с аппаратным обеспечением блока питания или перегрев материнской платы
Выполнить профилактику компьютера в целом. Заменить блок питания.
Ошибки Award BIOS
Сигнализация
Информация об ошибке
Варианты устранения неполадки
Обнаружены мелкие неисправности, на экране монитора должно появиться сообщение о необходимости входа в настройки BIOS для устранения проблем
Произвести сброс конфигурации BIOS. Убедиться в прочности соединения кабелей жестких дисков.
Проблемы с контроллером клавиатуры, который находится на материнской плате
Отключить клавиатуру и включить компьютер. Если загрузка компьютера продолжится либо появится сообщение об отсутствии клавиатуры, последнюю нужно заменить. Если используется USB-клавиатура, попробовать подключить ее в другой USB-порт.
1 сокращённый и 1 расширенный
Неисправность оперативной памяти видеокарты (RAM)
Если видеокарта съемная — выполнить профилактику. Заменить видеоадаптер, если не помогает.
1 продолжительный и 2 кратких
Ошибка общего характера видеоадаптера
Способ устранения, аналогичный ранее описанному.
1 длинный и 3 коротких
Системная неисправность клавиатуры
Проблема может возникнуть из-за механических повреждений кабеля клавиатуры. Кроме того, это может произойти после попадания жидкости на устройство. В такой ситуации требуется разобрать клавиатуру и тщательно высушить ее. Если это не решает проблему, необходимо заменить клавиатуру.
1 длинный и 9 коротких
Сбой микросхемы BIOS
Необходимо провести аппаратный сброс настроек BIOS. Если это сработало, но ошибка возникает снова после следующего включения компьютера, требуется перепрошить BIOS.
Непрерывно повторяющиеся короткие сигналы
Проблемы с источником питания или ОЗУ
Если стандартные методы обслуживания компьютера не дают результата, потребуется заменить источник питания или оперативную память.
Постоянно звучащие длинные сигналы
Неисправности оперативной памяти
Учитывается аналогичное решение, как и в предыдущем примере.
Постоянный сигнал с переменной частотой (низкая/высокая)
Неисправности центрального процессора
Превентивные меры по обслуживанию сокета материнской платы для установки центрального процессора. Замена ЦП или материнской платы.
Поломки блока питания
Если профилактика БП не помогает — ремонт или замена.
Ошибки Phoenix BIOS
Ошибки этой версии BIOS отображаются с помощью серии из трех групп звуковых сигналов, разделенных короткими паузами. В каждой группе может быть от 1 до 4 коротких звуковых сигналов. К примеру, последовательность 2 — 3 — 2 означает: два сигнала — пауза — три сигнала — пауза — два сигнала.
Сигнал
Описание ошибки
Возможное решение проблемы
Серьезная неисправность процессора
Единственный способ решения проблемы — замена центрального процессора.
Ошибка записи/чтения из динамической памяти CMOS
Осуществить возврат к заводским настройкам BIOS.
Сбой программного обеспечения BIOS
Решение, как и в предыдущем случае.
1 — 2 — 1 или 1 — 4 — 1
Не удается запустить материнскую плату
Причина может заключаться в одном из встроенных или внешних устройств, подключенных к плате, или в источнике питания. Рекомендуется провести общую диагностику компьютера. Если это не решает проблему, последовательно заменяйте комплектующие, чтобы выявить неисправный элемент.
1 — 2 — 2 или 1 — 2 — 3
Проблемы с устройством DMA (прямой доступ к памяти)
Необходима починка или смена материнской платы.
Не удается инициализировать схему регенерации ОЗУ
Проблема может заключаться как в оперативной памяти, так и в материнской плате. Также сбой может происходить из-за неверных настроек ОЗУ в BIOS. В первую очередь стоит попробовать сбросить настройки BIOS. Если это не решает проблему, следует провести профилактику блока питания. Во всех остальных ситуациях потребуется заменить оперативную память или материнскую плату.
Не удается инициализировать ОЗУ
Переставить планку ОЗУ в свободный слот материнской платы. Очистить контакты планки ОЗУ и слота для ее установки. Заменить оперативную память.
Системный таймер не может быть инициализирован
Вероятно, аккумулятор питания микросхемы CMOS разряжен. Если замена не решает проблему, рекомендуется провести профилактику компьютера. В случае необходимости, замените материнскую плату.
Возникла ошибка в одном из информационных портов материнской платы
Возможно, присутствует неисправность в одном из внешне подключаемых устройств — USB-устройства, монитор, принтер и т.д. Нужно отключить все устройства и включить компьютер. Если ошибка устранена, не подключать устройство, дающее сбой. В остальных случаях — ремонт или замена материнской платы.
2 — х — х, где "х" может принимать значения от 1 до 4
Произошла ошибка при попытке записать или прочитать один из битов (от 0 до 15) в первых 64 Кбайт оперативной памяти
Скорее всего, из строя вышла оперативная память и ее нужно заменить. Если не помогает, из строя вышла материнская плата.
Клавиатурный контроллер не работает
Выполните сброс параметров BIOS и замените клавиатуру.
Ошибка оперативной памяти видеокарты (RAM)
Уход за видеокартой или её замена.
Проблема с подключением к экрану
Убедитесь в исправности монитора, поменяйте кабель, соединяющий его с ПК
Ошибка собственного BIOS видеоплаты
Обслуживание видеокарты или её замена.
Постоянные длинные сигналы
Неисправность материнской платы либо одного из ее таймеров (первого или второго), последовательного или параллельного порта
В большинстве ситуаций требуется замена основной платы.
Постоянный сигнал с варьирующейся частотой
Аппаратная ошибка видеокарты
Замена электролитических конденсаторов на видеокарте может быть полезной.
Сигнал с постоянной частотой
Вентилятор, отвечающий за охлаждение процессора, может быть неисправен или отключен от материнской платы
Проверить, подключен ли вентилятор. Заменить, если не вращается.
BIOS LEGACY BOOT OF UEFI ONLY MEDIA при загрузке с флешки — как исправить ошибку?
Когда вы пытаетесь загрузить компьютер или ноутбук с флешки, созданной с помощью программы Rufus, может появиться сообщение ERROR: BIOS/LEGACY BOOT OF UEFI-ONLY MEDIA, с пояснением причин на английском языке и предложением нажать любую клавишу для перезагрузки.
В данной статье подробно рассматриваются возможные причины возникновения этой ошибки, способы ее иборьбы и успешной загрузки с флешки.
- Причины появления ошибки BIOS LEGACY BOOT OF UEFI ONLY MEDIA
- Процесс загрузки с флешки в режиме UEFI
- Создание загрузочной флешки Rufus в режиме Legacy (BIOS)
- Видеоуроки
Причина ошибки BIOS LEGACY BOOT OF UEFI ONLY MEDIA
Большинство современных ПК и ноутбуков поддерживают два режима загрузки с загрузочных накопителей: UEFI (EFI) и Legacy (CSM, BIOS, Compatibility Support Mode). При записи загрузочной флешки в Rufus пользователь выбирает, для какого режима её следует записать, по умолчанию (если ничего не выбирать) — для режима UEFI.
Если вы попытаетесь загрузиться с данной флешки в режиме Legacy, на экране возникнет сообщение ERROR: BIOS/LEGACY BOOT OF UEFI-ONLY MEDIA. Ошибка указывает на необходимость изменения режима загрузки в настройках BIOS/UEFI вашего устройства или на необходимость перезаписи флешки для соответствующего режима загрузки.
Загрузка с флешки в режиме UEFI
Наиболее лёгкое и быстрое решение в данной ситуации — осуществить загрузку с USB-накопителя в необходимом режиме. Это будет актуально для любых компьютеров, которые поддерживают режим UEFI (данный режим загрузки начал внедряться на большинстве современных устройств примерно с 2012 года).
Как это сделать? — есть два варианта:


Создание загрузочной флешки Rufus для режима Legacy BIOS
В случае, если предыдущий способ не устраивает вас, вы можете заново создать загрузочную флешку с использованием программы Rufus, настроив ее для работы в режиме Legacy (CSM).
Для этого необходимо в разделе «Схема раздела» установить значение MBR, а в разделе «Целевая система» выбрать «BIOS (или UEFI-CSM)», что будет сделано автоматически. После создания загрузочного USB-накопителя в указанном режиме, при его загрузке не возникнет ошибки ERROR: BIOS/LEGACY BOOT OF UEFI-ONLY MEDIA, если вы оставите те же настройки загрузки в BIOS, что использовались раньше.
Видео инструкция
Если у вас есть вопросы или что-то осталось неясным, оставляйте их в комментариях, и я постараюсь оказать помощь.
Немного о багах в BIOS/UEFI ноутбуков Lenovo/Fujitsu/Toshiba/HP/Dell
В этой статье я приведу описание багов в BIOS/UEFI ноутбуков, с которыми приходилось работать и для которых приходилось адаптировать загрузчики. В первую очередь речь пойдет о багах, которые не видны пользователю, но которые могут помешать работе загрузчика даже при условии, что все было сделано правильно.
Ошибки были обнаружены как в интерфейсах соответствующих сред выполнения, так и в коде режима SMM процессоров Intel. Приведенный материал основан на накопленном опыте, охватывающем достаточно длительный период времени. Поэтому к моменту написания конкретные модели были утрачены.
Тем не менее, остался список компаний-производителей, на ноутбуках которых наблюдались проблемы. Ошибки будут изложены последовательно, начиная с самых простых и заканчивая наиболее сложными. В процессе описания также будут предложены способы их обхода.
Прежде, чем мы начнем
Для того чтобы было полное понимание, при каких обстоятельствах приходилось сталкиваться с описываемыми проблемами, я кратко расскажу, какого сорта работу приходится выполнять. Существует продукт, шифрующий системный диск. Поэтому на этапе запуска ПК требуется расшифровывать диски, чтобы ОС могла запуститься. Поэтому был разработан загрузчик, который и выполняет эту роль.
После того как все перехватчики будут установлены, данный загрузчик передаст управление оригинальному загрузчику операционной системы. В дальнейшем термин "загрузчик" будет применяться для обозначения нашего загрузчика, тогда как "загрузчик ОС" будет ссылаться на загрузчик, который мы заменяем.
Проблемы запуска загрузчика (Lenovo, UEFI)
Согласно информации, UEFI использует глобальные переменные. В их числе находятся глобальные переменные, каждая из которых представляет собой вариант загрузки ПК (load option entry). Кроме того, имеется глобальная переменная BootOrder, определяющая последовательность вызова этих вариантов.
Таким образом, загрузчик записывался на системный раздел UEFI, и для него создавалась новая запись, когда в BootOrder этот загрузчик ставился первым в очереди. Однако при запуске ПК вызывался загрузчик Windows. Выяснилось, что UEFI начисто игнорировал значение BootOrder и загружал всегда Windows, если находил его запись.
У проблему удалось решить путем замены загрузочного файла Windows. Это, безусловно, требует дополнительных усилий, поскольку необходимо обеспечить защиту подменного файла в самой операционной системе.
Проблемы при посылке USB-команд (HP, UEFI)
Загрузчик взаимодействует с USB-устройствами, в частности с CCID-ридерами. Для работы с этими устройствами используется соответствующий протокол — EFI_USB_IO_PROTOCOL. Возникла проблема в том, что запущенный загрузчик не распознавал ни одно USB-устройство, хотя на других компьютерах этот же загрузчик выполнял свою задачу успешно.
Сначала могло показаться, что драйвера USB полностью не работают, однако при использовании ноутбука я заметил, что он без проблем загружался с флэшки. В дальнейшем выяснилось, что проблема заключается в отправке команд через управляющий канал (control transfer pipe) с помощью функции UsbControlTransfer протокола EFI_USB_IO_PROTOCOL. Прототип функции представлен ниже.
typedef EFI_STATUS (EFIAPI *EFI_USB_IO_CONTROL_TRANSFER) ( IN EFI_USB_IO_PROTOCOL* This, IN EFI_USB_DEVICE_REQUEST* Request, IN EFI_USB_DATA_DIRECTION Direction, IN UINT32 Timeout, IN OUT VOID* Data OPTIONAL, IN UINTN DataLength OPTIONAL, OUT UINT32* Status );
Функция всегда возвращалась с ошибкой EFI_USB_ERR_TIMEOUT. Оказалось, что тип EFI_USB_DATA_DIRECTION был реализован разработчиками не в соответствии с UEFI спецификацией. Определение самого типа из спецификации приведено ниже.
typedef enum < EfiUsbDataIn, EfiUsbDataOut, EfiUsbNoData >EFI_USB_DATA_DIRECTION;
Ошибка в реализации типа заключалась в том, что на данном ноутбуке EfiUsbDataIn и EfiUsbDataOut были перепутаны местами. В итоге, при вызове загрузчиком функции UsbControlTransfer с третьим параметром EfiUsbDataOut фактически происходило не записывание данных в устройство, а считывание с него. И наоборот.
Поскольку в коде приложения EfiUsbDataOut используется первым, драйвер USB пытался провести чтение данных с устройства, которые не могли быть доступны при отправленных запросах. В результате функция завершалась по таймауту.
Решение проблемы крайне некрасивое. При запуске загрузчик проверял, содержит ли поле FirmwareRevision структуры EFI_SYSTEM_TABLE строку «HPQ», и если содержит, проверялось, чтобы поле FirmwareRevision содержало значение 0x10000001. Если оба условия соблюдались, тогда при вызове соответствующих функций мы намерено меняли значения EfiUsbDataIn и EfiUsbDataOut на противоположные.
Проблемы при получении USB-ответов (Fujitsu LifeBook E743, UEFI)
Снаружи проблема проявлялась таким образом, что не все устройства CCID функционировали в загрузчике. Старые модели работали стабильно, а новые испытывали трудности. В процессе расследования выяснилось, что сложность возникала при выполнении функции UsbBulkTransfer протокола EFI_USB_IO_PROTOCOL. Эта функция постоянно возвращала ошибку EFI_DEVICE_ERROR.
Известно, что USB хост-контроллер передает данные с устройствами в виде пакетов фиксированного размера. Также разработчики USB допускают возможность того, что устройство может вернуть короткий пакет. В этом случае хост-контроллер вернет статус завершения передачи не как “Успех”, а как “Короткий пакет”. Драйвер USB интерпретировал такой ответ как ошибку. Таким образом, функция UsbBulkTransfer всегда возвращала EFI_DEVICE_ERROR, если устройство ответило коротким пакетом.
Так и получилось, что старые семейства CCID всегда отвечали длинными пакетами, когда новые – короткими. Проблему удалось обойти посредством анализа выходного буфера. Ниже на рисунке представлен формат RDR_to_PC_DataBlock пакетов CCID-устройств. Этот пакет устройство возвращает на такие команды, как PC_to_RDR_IccPowerOn, PC_to_RDR_Secure и PC_to_RDR_XfrBlock.
#pragma pack( push, 1 ) struct RDR_to_PC_DataBlock < UINT8 bMessageType; UINT32 dwLength; UINT8 bSlot; UINT8 bSeq; UINT8 bStatus; UINT8 bError; UINT8 bChainParameter; UINT8* abData[0]; >; #pragma pack( pop )
Поле bMessageType служит для определения типа пакета. Для пакета RDR_to_PC_DataBlock оно всегда установлено на 0x80. Поэтому перед тем, как получать ответ от устройства, это поле должно быть обнулено в буфере. Если функция UsbBulkTransfer возвращает ошибку, выполняется проверка значения этого поля. Если оно равно 0x80, считается, что устройство фактически дало правильный ответ. В этом случае поле dwLength используется для вычисления объема ответа, который затем возвращается первоначальному запрашивающему.
Проблемы при работе с картой памяти (Toshiba Satellite U200, BIOS)
Снаружи проблема проявлялась в том, что загрузчик не смог функционировать, так как не находил подходящий участок памяти для своего размещения. В ходе анализа обнаружены трудности в процессе сканирования карты памяти, когда некоторые диапазоны не анализировались и пропускались.
Здесь имеется в виду сервис 0xe820 прерывания int 15h. Поскольку загрузчик удерживал часть кода в резидентной памяти, необходимо было выделить участок памяти для размещения этого кода. Это, в свою очередь, требовало корректировки карты памяти, так чтобы операционная система не использовала наш выделенный участок в процессе своего старта. Таким образом, при запуске карта считывалась, должным образом изменялась и подменялась через перехват int 15h.
Ниже приведены входные и выходные параметры функции получения карты памяти.
- EAX – код функции, который всегда фиксируется на уровне 0xe820;
- EBX – указатель на продолжение, при первом вызове его значение должно составлять 0, а при последующих вызовах – значение, возвращенное предшествующей операцией. Этот регистр служит для указания функции, с какого места следует продолжить получение информации о памяти;
- ES:DI – адрес буфера, куда необходимо записать данные, описывающие определенный диапазон памяти;
- ECX – величина буфера, она не должна быть меньше 20, поскольку ранние версии этой функции возвращали записи размером 20 байтов. На современных системах размер записи равен 24 байта;
- EDX – сигнатура, всегда равная ‘SMAP’. Служит для проверки идентификации запросчика.
- CF – индикатор ошибки, если равно 0, то ошибок нет;
- EAX — сигнатура, всегда фиксируется как ‘SMAP’. Используется для проверки BIOS;
- ES:DI – указатель на буфер, аналогичный тому, что поступает на вход;
- ECX – объем записи, возвращаемый функцией;
- EBX – величина, которую необходимо передать в функцию для извлечения следующей записи. Не стоит делать предположения относительно её значения, поскольку это может быть смещение, индекс или любая иная составляющая во внутреннем устройстве данной функции.
На конкретном ноутбуке обнаружилось, что функция интерпретирует значение ECX несколько иначе. То есть, она не предназначена для определения размера записи, совместимого с запросом, а используется для указания количества записей, которые функция способна вернуть за один раз. В результате при вызове функции загрузчик считывал не одну запись, а две. Таким образом, одна из них всегда оставалась неучтенной загрузчиком. Это и стало причиной, по которой загрузчик не смог найти подходящий участок памяти для размещения резидентного кода.
Проблема была устранена путем передачи значения 24 в ECX. Таким образом, от концепции прямой совместимости пришлось отказаться. Обсуждались идеи о том, как определить размер записи, однако, учитывая разнообразие версий BIOS, возникал риск, что алгоритм также будет работать нестабильно.
Проблемы при остановке USB 3.0 и переинициализации PIC контроллеров (HP, BIOS)
Визуально проблема выглядела так: после того, как пользователь успешно подключил смарт-карту и ввел ПИН, экран темнел, выводилось сообщение о том, что идет загрузка ОС, и все останавливалось именно на этом сообщении. ПК зависал намертво.
Так как загрузчик BIOS создан на базе RTOS, пользовательский интерфейс функционирует в защищённом режиме процессора, что, безусловно, потребовало переинициализации традиционного контроллера PIC. Соответственно, при переходе управления к загрузчику ОС, процессор возвращался в реальный режим. Это, в свою очередь, требовало восстановления контроллера PIC в его начальное состояние.
Предварительный анализ показал, что процессор действительно возвращался в реальный режим, но затем происходила зависание ПК. В ходе дальнейшего расследования выяснили, что проблема возникала только в тех случаях, когда загрузчик инициализировал USB хост-контроллеры. Перед возвратом в реальный режим и перед восстановлением контроллера PIC также останавливались USB хост-контроллеры.
USB 3.0 хост контроллер может иметь регистр USBLEGSUP. Данный регистр позволяет передавать управление контроллером от BIOS к ОС и наоборот. В первую очередь, это может понадобиться, например, для эмуляции классических клавиатурных портов ввода/вывода, дабы обеспечить совместимость со старым ПО.
Таким образом, при обращении к указанным портам произойдет прерывание SMI, а дальнейшие действия будут выполняться обработчиком этого прерывания. На современных машинах все чаще применяются исключительно USB-клавиатуры. Структура регистра изложена ниже.
- ID возможности (Биты 0-7) – идентификатор функционала. Для данного регистра данное поле имеет значение 1
- Указатель на следующую возможность (Биты 8-15) – ссылается на следующий регистр возможностей
- Семафор, управляемый BIOS хоста (Бит 16) – если он установлен, это означает, что BIOS контролирует хост-контроллер
- Зарезервировано (Биты 17-23)
- Семафор, управляемый ОС хоста (Бит 24) – перед использованием хост-контроллера операционная система должна установить этот бит; в ответ на это BIOS сбросит бит 16, после чего хост-контроллер можно будет использовать
- Зарезервировано (Биты 25-31)
Успеха удалось достичь, дождавшись установки бита 16 в регистре USBLEGSUP, прежде чем вернуть PIC в его первоначальное состояние.
Проблемы доставки прерываний от PIC контроллера (Dell Latitude E7240, BIOS)
Ситуация была следующей: когда запускался загрузчик и появлялось приглашение для подключения смарт-карты, он застревал полностью. Данная проблема проявлялась только при перезагрузке компьютера, в то время как при его включении все функционировало корректно.
Предварительный анализ выявил, что процессор сваливался в page fault. Последующее изучение проблемы показало, что RTOS для каждого прерывания использует отдельные стеки, размер которых очень маленький (256 байт). Все эти стеки располагаются смежно, как это отражено на рисунке ниже.
Также было установлено, что page fault возник на области памяти, которая была непосредственно перед страницей с прерывающими стековыми данными. Поэтому дальнейшее исследование проводилось уже на данном уровне.
При инициализации USB хост-контроллера операционная система реального времени включает обработку прерываний PIC с линии, на которой находится контроллер. При активации обработчика прерывания он разрешает все прерывания на процессоре, а затем последовательно вызывает зарегистрированные обработчики для этой линии. По завершении вызова всех зарегистрированных обработчиков обработчик прерывания отправляет команду завершения прерывания (EOI) контроллеру PIC.
Известно, что PIC контроллер имеет ISR регистр. Этот регистр используется для того, чтобы определить, какие прерывания в настоящий момент обрабатывает процессор, а какие нет. И если процессор обрабатывает конкретное прерывание, то даже если на соответствующей линии присутствует запрос, оно доставлено не будет. До тех пор, пока процессор не выдаст EOI команду PIC контроллеру, после чего PIC возобновит доставку этого прерывания.
В результате дальнейшего анализа было установлено, что во время вызова зарегистрированных обработчиков PIC контроллер повторно инициировал прерывание, несмотря на то, что команда EOI еще не была отправлена. Это явная ошибка в эмуляции PIC контроллера. В итоге сначала происходило переполнение стека данного прерывания, затем нарушался стек других прерываний, что, наконец, вело к обращению к неотображаемой области памяти. Это вызывало page fault, который останавливал работу загрузчика.
Проблему удалось решить, временно отключив доставку соответствующего прерывания на PIC контроллере до вызова зарегистрированных обработчиков, а после их выполнения разрешив его снова.