Ap инициализация перед загрузкой микрокода что это
Перейти к содержимому

Ap инициализация перед загрузкой микрокода что это

  • автор:

Проблемы с загрузкой ПК

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

Как это работает

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

Решением данного парадокса является использование нескольких микропрограмм размещаемых в одной или нескольких микросхемах, BIOS (Basic Input/Output System). Процесс загрузки начинается с автоматического выполнения процессором команд, расположенных в постоянной (или перезаписываемой) памяти ( EEPROM или Flash ROM ), начиная с заданного адреса. Эти микропрограммы не обладает всей функциональностью операционной системы, но её (функциональности) достаточно для того, чтобы чтобы выполнить последовательную загрузку других программ, которые выполняются друг за другом до тех пор, пока последняя из них не загрузит операционную систему.

Последовательность основных блоков функций BIOS в PC -совместимых компьютерах:

1. — POST — самотестирование при включении питания процессора, памяти, набора микросхем системной логики, видеоадаптера, контроллера дисков, клавиатуры, мыши и других контроллеров и устройств;

2. — Setup BIOS ( программа установки параметров BIOS) — конфигурирование параметров системы. Она может быть запущена во время выполнения процедуры POST при нажатии определенной комбинации клавиш. Если она не была вызвана пользователем, загружаются параметры установленные и сохраненные в постоянной памяти в о время последнего конфигурирования Setup BIOS .

3. — Загрузчик операционной системы — подпрограмма, выполняющая поиск действующего основного загрузочного сектора на дисковом устройстве.

4. — BIOS — набор драйверов, предназначенных для взаимодействия операционной системы и аппаратного обеспечения при загрузке системы.

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

Зачем это нужно?

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

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

К ним относятся:

  • устройства ввода (клавиатура, мышь),
  • базовое устройство вывода (дисплей),
  • устройство, с которого будет произведена загрузка ОС — дисковод, жесткий диск, CD-ROM, флэш-диск, SCSI-устройство, сетевая карта (при загрузке по сети)

Затем BIOS опрашивает устройства, перечисляемые в заранее созданном списке, пока не найдёт загрузочное устройство. Если такое устройство найдено не будет, будет выведено сообщение об ошибке, а процесс загрузки будет остановлен. Если BIOS обнаружит загрузочное устройство, он считает с него начальный загрузчик и передаст ему управление.

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

Если активного раздела не существует, или загрузочный сектор активного раздела некорректен, MBR может загрузить резервный начальный загрузчик и передать управление ему. Резервный начальный загрузчик должен выбрать раздел (зачастую с помощью пользователя), загрузить его загрузочный сектор и передать ему управление.

Последовательность загрузки стандартного IBM-совместимого персонального компьютера

После включения персонального компьютера его процессор еще не начинает работу.

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

После этого чипсет формирует сигнал сброса центрального процессора, по которому очищаются регистры процессора, и он запускается.

Первая выполняемая команда расположена по адресу FFFF0h и принадлежит пространству адресов BIOS. Данная команда просто передает управление программе инициализации BIOS и выполняет следующую команду (микропрограмму BIOS ).

Программа инициализации BIOS с помощью программы POST проверяет, что все необходимые для работы BIOS и последующей загрузки основной операционной системы, устройства компьютера работают корректно и инициализирует их.

Таким образом, его работа — последовательно читать и выполнять команды из памяти.

Системная память сконфигурирована так, что первая команда, которую считает процессор после сброса, будет находиться в микросхеме BIOS.

Последовательно выбирая команды из BIOS, процессор начнет выполнять процедуру самотестирования, или POST.

Процедура самотестирования POST состоит из нескольких этапов.

  • Первоначальная инициализация основных системных компонентов;
  • Детектирование оперативной памяти, копирование кода BIOS в оперативную память и проверка контрольных сумм BIOS;
  • Первоначальная настройка чипсета;
  • Поиск и инициализация видеоадаптера. Современные видеоадаптеры имеют собственную BIOS, которую системная BIOS пытается обнаружить в специально отведенном сегменте адресов. В ходе инициализации видеоадаптера на экране появляется первое изображение, сформированное с помощью BIOS видео адаптера ;
  • Проверка контрольной суммы CMOS и состояния батарейки. Если контрольная сумма CMOS ошибочна, будут загружены значения по умолчанию ;
  • Тестирование процессора и оперативной памяти. Результаты тестирования обычно выводятся на экран ;
  • Подключение клавиатуры, тестирование портов ввода/вывода и других устройств.
  • Инициализация дисковых накопителей. Сведения об обнаруженных устройствах обычно выводятся на экран ;
  • Распределение ресурсов между устройствами и вывод таблицы с обнаруженными устройствами и назначенными для них ресурсами;
  • Поиск и инициализация устройств, имеющих собственную BIOS;
  • Вызов программного прерывания BIOS INT 19h, который ищет загрузочный сектор на устройствах, указанных в списке загрузки.

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

Что такое POST-коды?

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

Если быть совсем точным, во многих современных чипсетах перед передачей команд процессору системным контроллером предварительно конфигурируется «умная» системная шина. Но это не меняет сути дела.

Основная задача BIOS на данном этапе — проверка исправности и инициализация основных аппаратных компонентов компьютера. Вначале конфигурируются внутренние регистры чипсета и процессора, проверяется целостность кода BIOS. Затем происходит определение типа и размера оперативной памяти, поиск и инициализация видеокарты (интегрированной в чипсет или внешней). Следом конфигурируются порты ввода-вывода, контроллер дисковода, IDE/SATA-контроллер и подключенные к нему накопители. И, наконец, осуществляется поиск и инициализация интегрированных на материнскую плату дополнительных контроллеров и установленных карт расширения. Всего получается около ста промежуточных шагов, после чего управление передается загрузчику BOOTStrap, отвечающему за старт операционной системы.

Каждый из шагов POST-тестов имеет свой уникальный номер, называемый POST-кодом. Перед началом выполнения очередной процедуры ее POST-код записывается в специальный порт, именуемый Manufacturing Test Port. При успешной инициализации устройства в Manufacturing Test Port записывается POST-код следующей процедуры и так далее, до полного прохождения всех тестов. Если сконфигурировать устройство не удалось, дальнейшее выполнение POST-тестов прекращается, а в Manufacturing Test Port остается POST-код процедуры, вызывавшей сбой. Прочитав его можно однозначно идентифицировать проблемное устройство.

Имейте в виду, после перезагрузки компьютера средствами операционной системы («мягкая» или «горячая» перезагрузка) или при выходе из энергосберегающего режима обычно выполняются не все шаги по тестированию и конфигурированию аппаратных компонентов, а только необходимый минимум — так быстрее. При поиске неисправности необходимо всегда выполнять «жесткую» («холодную») перезагрузку — клавишей RESET или отключением питания компьютера. Только так гарантируется, что все этапы инициализации будут выполнены в полном объеме.

Award BIOS 6.0: вариант полной загрузки

Данную таблицу можно использовать не только как список POST-кодов, но и как последовательность действий, которые выполняются при включении компьютера. Она содержит POST-коды, которые отображаются при полной процедуре POST.

POST-код Описание процедуры
CF Определяется тип процессора и тестируется чтение/запись CMOS
C0 Предварительно инициализируется чипсет и L1-, L2-кэш, программируется контроллер прерываний, DMA, таймер
C1 Детектируется тип и объем оперативной памяти
C3 Код BIOS распаковывается во временную область оперативной памяти
Проверяются контрольные суммы BIOS
C5 Код BIOS копируется в теневую память и управление передается модулю Boot Block
01 Модуль XGROUP распаковывается по физическому адресу 1000:0000h
02 Инициализация процессора. Устанавливаются регистры CR и MSR
03 Определяются ресурсы ввода/вывода (Super I/O)
05 Очищается экран и флаг состояния CMOS
06 Проверяется сопроцессор
07 Определяется и тестируется контроллер клавиатуры
08 Определяется интерфейс клавиатуры
09 Инициализация контроллера Serial ATA
0A Определяется клавиатура и мышь, которые подключены к портам PS/2
0B Устанавливаются ресурсы звукового контроллера AC97
OE Тестируется сегмент памяти F000h
10 Определяется тип flash-памяти
12 Тестируется CMOS
14 Устанавливаются значения для регистров чипсета
16 Первично инициализируется тактовый генератор
18 Определяется тип процессора, его параметры и объемы кэша L1 и L2
1B Инициализируется таблица векторов прерываний
Проверяются контрольные суммы CMOS и напряжение питания аккумулятора
1D Определяется система управления питанием Power Management
1F Загружается матрица клавиатуры (для ноутбуков)
21 Инициализируется система Hardware Power Management (для ноутбуков)
23 Тестируется математический сопроцессор, дисковод, инициализация чипсета
24 Обновляется микрокод процессора. Создается карта распределения ресурсов устройств Plug and Play
25 Начальная инициализация PCI: перечисляются устройства, поиск адаптера VGA, запись VGA BIOS по адресу C000:0
26 Устанавливается тактовая частота по CMOS Setup. Отключается синхронизация неиспользуемых слотов DIMM и PCI. Инициализируется система мониторинга (H/W Monitor)
27 Разрешается прерывание INT 09h. Снова инициализируется контроллер клавиатуры
29 Программируются регистры MTRR, инициализируется APIC. Программируется контроллер IDE. Измеряется частота процессора. Вызывается расширение BIOS видеосистемы
2B Поиск BIOS видеоадаптера
2D Отображается заставка Award, информация о типе процессора и его скорости
33 Сбрасывается клавиатура
35 Тестируется первый канал DMA
37 Тестируется второй канал DMA
39 Тестируются страничные регистры DMA
3C Настраивается контроллер 8254 (таймер)
3E Проверка контроллера прерываний 8259
43 Проверяется контроллер прерываний
47 Тестируются шины ISA/EISA
49 Вычисляется объем оперативной памяти. Настраиваются регистры для процессора AMD K5
4E Программируются регистры MTRR для процессоров Syrix. Инициализируются кэш L2 и APIC
50 Определяется шина USB
52 Тестируется ОЗУ с отображением результатов. Очищается расширенная память
53 Если выполнена очистка CMOS, то сбрасывается пароль на вход в систему
55 Отображается количество процессоров (для многопроцессорных платформ)
57 Отображается логотип EPA. Начальная инициализация устройств ISA PnP
59 Определяется система защиты от вирусов
5B Вывод подсказки для запуска обновления BIOS с дискеты
5D Запускается контроллер Super I/O и интегрированный аудиоконтроллер
60 Вход в CMOS Setup, если была нажата клавиша Delete
65 Инициализируется мышь PS/2
69 Включается кэш L2
6B Настраиваются регистры чипсета согласно BIOS Setup
6D Назначаются ресурсы для устройств ISA PnP и COM-порты для интегрированных устройств
6F Инициализируется и настраивается контроллер гибких дисков
75 Детектируются и устанавливаются IDE-устройства: жесткие диски, CD/DVD, LS-120, ZIP и др
76 Выводится информация об обнаруженных IDE-устройствах
77 Инициализируются последовательные и параллельные порты
7A Сбрасывается и готовится к работе математический сопроцессор
7C Определяется защита от несанкционированной записи на жесткие диски
7F При наличии ошибок выводится сообщение и ожидается нажатие клавиш Delete и F1
82 Выделяется память для управления питанием и заносятся изменения в таблицу ESCD. Убирается заставка с логотипом EPA. Запрашивается пароль, если нужен
83 Все данные сохраняются из временного стека в CMOS
84 Вывод на экран сообщения Initializing Plug and Play Cards
85 Завершается инициализация USB
87 Создаются таблицы SYSID в области DMI
89 Устанавливаются таблицы ACPI. Назначаются прерывания для PCI-устройств
8B Вызывается BIOS дополнительных ISA- или PCI-контроллеров, за исключением видеоадаптера
8D Устанавливаются параметры контроля четности ОЗУ по CMOS Setup. Инициализируется APM
8F IRQ 12 разрешается для «горячего» подключения мыши PS/2
94 Завершение инициализации чипсета. Отображение таблицы распределения ресурсов. Включение кэша L2. Установка режима перехода на летнее/зимнее время
95 Устанавливается частота автоповтора клавиатуры и состояния Num Lock
96 Для многопроцессорных систем настраиваются регистры (для процессоров Cyrix). Создается таблица ESCD. Устанавливается таймер DOS Time по показаниям часов RTC CMOS. Сохраняются разделы загрузочных устройств для использования встроенным антивирусом. Динамик оповещает об окончании POST. Создается таблица MSIRQ FF Выполняется прерывание BIOS INT 19h. Поиск загрузчика в первом секторе загрузочного устройства

Невыполнение или сбой выполнения любого шага в последовательности тестов приводит к остановке тестирования и выдаче POST — кода соответствующего данному шагу сбоя.

POST — коды других производителей можно найти на сайтах производителя Вашей системной платы или производителя DIOS или в Internet .

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

Примером может быть Post карта PCI BM9222 .

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

Примером может быть системная плата ECS H67H2-M , или модели X58 Extreme3, P55 Deluxe3 и 890GX Extreme3 .

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

Последняя возможность узнать о сбое проявившемся при тестировании Звуковые сигналы сообщений об ошибках.

Звуковые сигналы и сообщения об ошибках

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

Но для этого необходимо, чтобы в корпусе ПК имел системный динамик и он был подключен к системной платы.

Звуковые сигналы особенно ценны на начальном этапе, когда видеокарта еще не проинициализирована и, как следствие, не в состоянии отобразить что-либо на экране. Уникальная комбинация длинных и коротких сигналов укажет на проблемный компонент.

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

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

Последовательность звуковых сигналов Описание ошибки
1 короткий Успешный POST
2 коротких Обнаружены незначительные ошибки. На экране монитора появляется предложение войти в программу CMOS Setup Utility и исправить ситуацию. Проверьте надежность крепления шлейфов в разъемах жесткого диска и материнской платы.
3 длинных Ошибка контроллера клавиатуры
1 короткий, 1 длинный Ошибка оперативной памяти (RAM)
1 длинный, 2 коротких Ошибка видеокарты
1 длинный, 3 коротких Ошибка при инициализации клавиатуры или Ошибка видеокарты
1 длинный, 9 коротких Ошибка при чтении из ПЗУ
Повторяющийся короткий Проблемы с блоком питания
Повторяющийся длинный Проблемы с ОЗУ
Повторяющаяся высокая-низкая частота Проблемы с CPU
Непрерывный Проблемы с блоком питания
Процедура Setup

Вход в BIOS Setup

Вход в BIOS Setup возможен только при включении компьютера и при успешном выполнении первоначального тестировании POST (слышен один короткий сигнал из системного динамика).

Для этого необходимо нажать определенную клавишу или сочетание клавиш.

Обычно на экранной заставке при тестировании отображается надпись типа «Press DEL to enter Setup» — это означает, что для входа в BIOS Setup необходимо нажать клавишу DEL. Узнать, за которой клавишей закреплен вход в BIOS, можно из инструкции к материнской плате. Если инструкции нет, а экранная заставка не отображает подсказки, можно опробовать наиболее известные варианты комбинаций:

Delete
Esc
Ctrl + Shift + S или Ctrl + Alt + S
Ctrl + Alt + Esc
Ctrl + Alt + Delete

Безопасная работа с BIOS Setup

Работа с BIOS Setup связана с определенным риском, поскольку при неправильном или неосторожном изменении параметра система может функционировать нестабильно либо не функционировать вообще. Есть несколько простых советов, которые позволяют свести возможный риск к минимуму:

  • Экспериментировать с настройками BIOS Setup лучше всего на новом не заполненном информацией компьютере;
  • Старайтесь вообще не экспериментировать с BIOS на компьютерах, обрабатывающих или хранящих важную или объемную информацию. Перед настройкой системы с помощью BIOS позаботьтесь о резервном копировании важных данных. Главное в таких компьютерах — стабильность. Подвисший разогнанный компьютер через несколько часов обработки видео — это потеря времени, электроэнергии и результата работы. Неразогнанный справится с данной задачей гораздо эффективнее и сохранит ваши нервы;
  • Прежде, чем изменить важные параметры, всегда фиксируйте выставленное и измененное значение. Это позволит вам в случае нестабильной работы системы вернуть ее в рабочее состояние;
  • Не изменяйте значения параметров, которые вам неизвестны. Уточните их значение либо в инструкции к материнской плате, либо в сети Internet на ресурсе разработчика платы;
  • Не редактируйте за раз несколько важных не связанных между собой параметров. При нестабильной работе системы гораздо сложнее определить, какой параметр вызвал нестабильную работу;
  • Не разгоняйте компьютер без соответствующей изучения работы разгоняемой системы и подготовки;
  • Не используйте раздел Hard Disk Utility, который предназначен для низкоуровневого форматирования устаревших моделей жестких дисков и встречается в старых версиях BIOS, т.к. может вывести из строя современный жесткий диск;
  • Если после выставления параметров и выхода из BIOS компьютер перестает запускаться вообще, вернуть систему в рабочее состояние можно несколькими способами:
    • Если после перезагрузки компьютера возможно войти в BIOS Setup, нужно установить прежние значения отредактированных параметров. Некоторые версии BIOS сами осуществляют откат изменений за последнюю сессию.
    • Если сделанные изменения неизвестны, то лучше воспользоваться параметрами по умолчанию, использовав команду Load Fail-Safe Defaults. После этого придется настраивать систему на оптимальную работу.
    • Если компьютер вовсе не запускается из-за неправильных настроек BIOS, то в таком случае необходимо обнулить содержимое CMOS. При этом все значения включая дату/время будут изменены. Для этого сбросить неправильные установки, для этого просто переместить перемычку Flash Recovery ( IBM ) или джампер Clearing CMOS в положение «очистка CMOS «. В последнем случае нужно просто замкнуть перемычкой на несколько минут контакты соответствующего джампера.
    • В случае неудачных результатов настройки Setup BIOS , необходимо после сброса неудачной конфигурации с помощью джампера в процедуре Setup BIOS продублировать возвращение загрузку значений BIOS по умолчанию с помощью команды «Load Fail-Safe Defaults «. Ваша система вернется в исходное состояние.

    В Award BIOS 6.0 это строка меню Setup BIOS — » Load Optimized Defaults » или «Load Fail-Safe Defaults » в этом случае загружается исходная настройки Setup BIOS .

    Собственный BIOS имеется и на других платах устанавливаемых в компьютер, например:

    • видеоадаптерах;
    • SCSI адаптеры;
    • сетевые адаптеры и других.

    Сборка А. Сорокин

    2. Модернизация и ремонт ПК, 15-е издание, Пер. с англ, М, изд. дом «Вильямс» 2005

    Исправление ошибок в CPU

    Не для кого не секрет, что процессор представляет собой автомат с микропрограммным управлением. И любая его инструкция является совокупностью микрокоманд, прошитых в ПЗУ процессора при его изготовлении. Ошибки микрокода и схемные погрешности (errata), допущенные при проектировании, могут вызывать отклонения от спецификаций процессора и ошибкам в его работе. При выпуске процессора обычно публикуются его спецификация и список обнаруженных errata.

    Все процессоры Intel с архитектурой P6, а к ним относятся семейства Pentium Pro, Pentium II & III, Celeron, Pentium II & III Xeon и Pentium II Overdrive, обладают таким замечательным свойством, как «reprogrammable microcode». В этих процессорах имеется возможность изменения микрокода, т.е. имеется возможность исправления ошибок в программно-схемотехнической реализации конкретных процессоров семейства P6 и некоторых встроенных ошибок практически на уровне «железа». Ошибки могут появляться на этапе проектирования процессоров, а исправляются они именно с помощью изменения микрокода. Каждое из подсемейств (PII, Celeron, PPro, Xeon) имеет спецификацию. При выпуске каждого нового степпинга процессора (внутри него все приборы являются идентичными в рамках технологических отклонений), Intel публикует для него обновление спецификации, где указываются обнаруженные и исправленные errata (отклонения от спецификации).

    Ошибки эти могут, в принципе, осложнить жизнь программному обеспечению, которое работает на этих «дефектных» процессорах (и пользователю ;-)) .

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

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

    Сами обновления микрокода — это 2-хкилобайтные блоки данных, прошитые в системном BIOS. Такой блок есть для каждого степпинга процессора из семейства P6. Intel поставляет свежие версии микрокода ведущим производителям BIOS. База данных с обновлениями пополняется и изменяется при появлении новых моделей и версий микрокода. Intel рекомендует выполнять обновление версий микрокода с помощью своей утилиты при установке нового процессора на материнскую плату или перепрограммирования флэш-памяти, чтобы быть уверенным, что в BIOS содержится самая свежая версия микрокода. Эта программа определяет используемый процессор (с помощью CPUID) и ищет соответствующее ему обновление в своей базе. Если найдена свежая версия микрокода, утилита локально перепрошивает код в BIOS, не затрагивая остальные участки. Т.о. отпадает необходимость перепрограммирования всего флэша для поддержки нового ЦПУ, как это было ранее. Обновление базы данных Intel периодически выкладывает на своем сайте.

    Последняяи из доступных нам баз имеет ревизию 5.01 и содержит следующие версии микрокода:

    Processor Processor Stepping Microcode Update Rev
    Pentium III Processor 0x672 0x04
    Pentium III Processor 0x673 0x02
    Pentium III Xeon Processor 0x672 0x21
    Pentium III Xeon Processor 0x673 0x22
    Pentium II Processor 0x633 0x34
    Pentium II Processor 0x634 0x35
    Pentium II Processor 0x650 0x32
    Pentium II Processor 0x651 0x30
    Pentium II Processor 0x652 0x14
    Pentium II Processor 0x653 0x01
    Pentium II Xeon Processor 0x652 0x29
    Pentium II Xeon Processor 0x653 0x04
    Intel Celeron Processor 0x650 0x32
    Intel Celeron Processor 0x651 0x30
    Intel Celeron Processor 0x660 0x09
    Intel Celeron Processor 0x665 0x02
    Pentium II OverDrive Processor x1632 0x02
    Pentium Pro Processor 0x612 0xC6
    Pentium Pro Processor 0x616 0xC6
    Pentium Pro Processor 0x617 0xC6
    Pentium Pro Processor 0x619 0xD2

    Загрузить последнюю версию утилиты, исправляющую микрокод можно прямо отсюда: pupdt501.exe (115 Kb)

    Старую базу (PEP15.PDB) можно загрузить отсюда: pupdt461.exe (111 Кб)

    После окончания работы утилиты, необходимо выключить питание компьютера. Загрузка обновления в процессор происходит во время выполнения POST при каждом запуске системы. Естественно для работы утилиты необходимо разрешить перезапись флэш-памяти перемычкой или в BIOS Setup. Программа должна запускаться из-под «голого» ДОСа.

    Однако для такого идеального варианта необходима поддержка BIOS’ом специального API обновления микрокода процессора, позволяющего утилите обновления с помощью BIOS загрузить новый микрокод. Если используемая версия системного BIOS не поддерживает API, пользователю ничего не остается, кроме как добыть новую версию у производителя материнской платы. Однако бывает, что найти её не так уж просто, если не невозможно. Зачастую, после прекращения производства какой-либо модели системной платы, производитель перестает выпускать и обновления биосов для нее, но при этом новые процессоры могут появиться в продаже, а у пользователя может возникнуть желание установить в свою систему новый CPU.

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

    Возникает вопрос, а чем чревато самостоятельное обновление прошивки? Ну, во-первых, сначала нужно удостовериться, что вам это действительно необходимо. Если версия прошивки старая, а новых версий BIOS производитель системной платы не предлагает, но, главное, вы столкнулись с нестабильной работой какого-то приложения, и рассчитываете, что изменение микрокода процессора вам поможет. Только в этом случае имеет смысл самостоятельно изменить прошивку. А насчет того, чем это чревато — по-моему, ничем опасным. Во-первых, не стоит забывать, что загрузка обновления микрокода в процессор применяется во всех BIOS на платах для P6 и уже давно (многие видели в Setup загадочную опцию Microcode Update: Enable/Disable). И ничего! Все работает.

    Это еще раз подчеркивает необходимость его использования. Кто знает, как бы обстояло дело без этого обновления! Отличие лишь в том, что раньше микрокод обновлялся с установкой новой версии флэша, а теперь можно перепрограммировать не все содержимое BIOS, а лишь ограниченный кусок.

    Мой личный опыт работы с этой программой пока был ограничен 7 случаями, из которых удалось обновить микрокод только на одной системной плате (Abit LX6 c PII 233). В остальных случаях BIOS уже содержал обновленные версии микрокода. Также не удалось встретить BIOS, не поддерживающий обновление микрокода.

    Что касается аналогичной возможности обновления микрокода в процессорах других производителей (AMD, Cyrix), то никакой информации по этому вопросу мне найти не удалось. Но я почти уверен, что в этих CPU имеется аналогичная возможность изменения микрокода.

    За всеми более подробными разъяснениями рекомендую всем заинтересованным посетить сайт www.intel.com.

    24 марта 1999 Г.

    How to Correct CPU Errata (Errors)

    Исправление ошибок в CPU

    Не для кого не секрет, что процессор представляет собой автомат с микропрограммным управлением. И любая его инструкция является совокупностью микрокоманд, прошитых в ПЗУ процессора при его изготовлении. Ошибки микрокода и схемные погрешности (errata), допущенные при проектировании, могут вызывать отклонения от спецификаций процессора и ошибкам в его работе. При выпуске процессора обычно публикуются его спецификация и список обнаруженных errata.

    Все процессоры Intel с архитектурой P6, а к ним относятся семейства Pentium Pro, Pentium II & III, Celeron, Pentium II & III Xeon и Pentium II Overdrive, обладают таким замечательным свойством, как «reprogrammable microcode». В этих процессорах имеется возможность изменения микрокода, т.е. имеется возможность исправления ошибок в программно-схемотехнической реализации конкретных процессоров семейства P6 и некоторых встроенных ошибок практически на уровне «железа». Ошибки могут появляться на этапе проектирования процессоров, а исправляются они именно с помощью изменения микрокода. Каждое из подсемейств (PII, Celeron, PPro, Xeon) имеет спецификацию. При выпуске каждого нового степпинга процессора (внутри него все приборы являются идентичными в рамках технологических отклонений), Intel публикует для него обновление спецификации, где указываются обнаруженные и исправленные errata (отклонения от спецификации).

    Ошибки эти могут, в принципе, осложнить жизнь программному обеспечению, которое работает на этих «дефектных» процессорах (и пользователю ;-)) .

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

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

    Сами обновления микрокода — это 2-хкилобайтные блоки данных, прошитые в системном BIOS. Такой блок есть для каждого степпинга процессора из семейства P6. Intel поставляет свежие версии микрокода ведущим производителям BIOS. База данных с обновлениями пополняется и изменяется при появлении новых моделей и версий микрокода. Intel рекомендует выполнять обновление версий микрокода с помощью своей утилиты при установке нового процессора на материнскую плату или перепрограммирования флэш-памяти, чтобы быть уверенным, что в BIOS содержится самая свежая версия микрокода. Эта программа определяет используемый процессор (с помощью CPUID) и ищет соответствующее ему обновление в своей базе. Если найдена свежая версия микрокода, утилита локально перепрошивает код в BIOS, не затрагивая остальные участки. Т.о. отпадает необходимость перепрограммирования всего флэша для поддержки нового ЦПУ, как это было ранее. Обновление базы данных Intel периодически выкладывает на своем сайте.

    Последняяи из доступных нам баз имеет ревизию 5.01 и содержит следующие версии микрокода:

    ProcessorProcessor SteppingMicrocode Update Rev
    Pentium III Processor0x6720x04
    Pentium III Processor0x6730x02
    Pentium III Xeon Processor0x6720x21
    Pentium III Xeon Processor0x6730x22
    Pentium II Processor0x6330x34
    Pentium II Processor0x6340x35
    Pentium II Processor0x6500x32
    Pentium II Processor0x6510x30
    Pentium II Processor0x6520x14
    Pentium II Processor0x6530x01
    Pentium II Xeon Processor0x6520x29
    Pentium II Xeon Processor0x6530x04
    Intel Celeron Processor0x6500x32
    Intel Celeron Processor0x6510x30
    Intel Celeron Processor0x6600x09
    Intel Celeron Processor0x6650x02
    Pentium II OverDrive Processorx16320x02
    Pentium Pro Processor0x6120xC6
    Pentium Pro Processor0x6160xC6
    Pentium Pro Processor0x6170xC6
    Pentium Pro Processor0x6190xD2

    Загрузить последнюю версию утилиты, исправляющую микрокод можно прямо отсюда: pupdt501.exe (115 Kb)

    Старую базу (PEP15.PDB) можно загрузить отсюда: pupdt461.exe (111 Кб)

    После окончания работы утилиты, необходимо выключить питание компьютера. Загрузка обновления в процессор происходит во время выполнения POST при каждом запуске системы. Естественно для работы утилиты необходимо разрешить перезапись флэш-памяти перемычкой или в BIOS Setup. Программа должна запускаться из-под «голого» ДОСа.

    Однако для такого идеального варианта необходима поддержка BIOS’ом специального API обновления микрокода процессора, позволяющего утилите обновления с помощью BIOS загрузить новый микрокод. Если используемая версия системного BIOS не поддерживает API, пользователю ничего не остается, кроме как добыть новую версию у производителя материнской платы. Однако бывает, что найти её не так уж просто, если не невозможно. Зачастую, после прекращения производства какой-либо модели системной платы, производитель перестает выпускать и обновления биосов для нее, но при этом новые процессоры могут появиться в продаже, а у пользователя может возникнуть желание установить в свою систему новый CPU.

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

    Возникает вопрос, а чем чревато самостоятельное обновление прошивки? Ну, во-первых, сначала нужно удостовериться, что вам это действительно необходимо. Если версия прошивки старая, а новых версий BIOS производитель системной платы не предлагает, но, главное, вы столкнулись с нестабильной работой какого-то приложения, и рассчитываете, что изменение микрокода процессора вам поможет. Только в этом случае имеет смысл самостоятельно изменить прошивку. А насчет того, чем это чревато — по-моему, ничем опасным. Во-первых, не стоит забывать, что загрузка обновления микрокода в процессор применяется во всех BIOS на платах для P6 и уже давно (многие видели в Setup загадочную опцию Microcode Update: Enable/Disable). И ничего! Все работает.

    Это еще раз подчеркивает необходимость его использования. Кто знает, как бы обстояло дело без этого обновления! Отличие лишь в том, что раньше микрокод обновлялся с установкой новой версии флэша, а теперь можно перепрограммировать не все содержимое BIOS, а лишь ограниченный кусок.

    Мой личный опыт работы с этой программой пока был ограничен 7 случаями, из которых удалось обновить микрокод только на одной системной плате (Abit LX6 c PII 233). В остальных случаях BIOS уже содержал обновленные версии микрокода. Также не удалось встретить BIOS, не поддерживающий обновление микрокода.

    Что касается аналогичной возможности обновления микрокода в процессорах других производителей (AMD, Cyrix), то никакой информации по этому вопросу мне найти не удалось. Но я почти уверен, что в этих CPU имеется аналогичная возможность изменения микрокода.

    За всеми более подробными разъяснениями рекомендую всем заинтересованным посетить сайт www.intel.com.

    24 марта 1999 г. Александр Кириллов

    Как загружается процессор Intel x86

    image

    Когда мы включаем компьютер, он успевает совершить несколько этапов работы ещё до того, как загрузится операционная система. В этом посте будет рассмотрено, как загружается типичный процессор с архитектурой x86. Это очень сложный и многоступенчатый процесс. Здесь его структура будет представлена только в самом общем виде. От загрузочной прошивки зависит, каким именно путём процессор придёт к тому состоянию, в котором сможет загрузить операционную систему. Мы проследим этот процесс на примере опенсорсной загрузочной прошивки coreboot.

    ❯ До того, как будет подано питание

    Начнём с чипа BIOS, также именуемого загрузочным ROM. Чип BIOS – это кремниевый элемент на материнской плате компьютера, в нём хранится информация (в байтах). Нас интересуют две составляющие его работы. Во-первых, (как минимум, отчасти) он отображается в памяти на адресное пространство ЦП – и это значит, что ЦП может обращаться к нему точно как к ОЗУ. В частности, ЦП может направить свой указатель инструкций на код, выполняемый внутри чипа BIOS. Во-вторых, те байты, что хранятся в чипе BIOS, соответствуют самым первым инструкциям, выполняемым в ЦП. Также в чипе BIOS содержатся и другие фрагменты кода и данных. В типичном BIOS находится флеш-дескриптор (таблица с содержимым чипа BIOS), регион BIOS (первые инструкции, которые должны быть выполнены), Intel ME (движок управления Intel) и GbE (gigabit ethernet). Как видите, чип BIOS совместно используется несколькими компонентами системы, а не только ЦП.

    ❯ Когда подано питание

    Современные чипы Intel оснащаются так называемым Intel Management Engine. Как только получено питание (от батареи или электросети), включается Intel ME. Он выполняет свой набор процедур инициализации, для чего требуется прочитать во флеш-дескрипторе BIOS, где именно находится регион Intel ME, а затем, именно из этого региона BIOS прочитать код и конфигурационные данные. Далее мы нажимаем кнопку питания на системнике, и в дело вступает ЦП. В многопроцессорной системе всегда есть выделенный процессор BSP (начальный процессор), применяемый именно для этой цели. Как бы то ни было, процессор всегда переходит в так называемый 16-разрядный реальный режим, где указатель инструкций направлен на адрес 0xffff.fff0. Это вектор сброса.

    Может возникнуть вопрос: как 16-разрядный системный адрес 0xffff.fff0, явно находящийся за пределами 0xffff, максимального 16-разрядного значения? В 16-разрядном режиме физический адрес рассчитывается так: на 4 разряда влево сдвигается сегментный регистр кода (CS), а затем добавляется адрес указателя инструкций (IP). При сбросе в IP содержится значение 0xfff0, а в CS – значение 0xf000. По вышеприведённой формуле вычисляем, что физический адрес должен быть:

    — всё равно не то, что мы ожидали. Дело в том, что при сбросе система находится в «особом» реальном режиме, где первые 12 адресных строк всегда известны заранее. Поэтому все адреса имеют вид 0xfffx.xxxx. В нашем случае это означает, что мы должны сами установить 12 наиболее важных разрядов в выведенном нами адресе, что и даёт в результате ожидаемый адрес 0xffff.fff0. Эти 12 строк в адресе так и остаются «утверждёнными», пока не будет выполнен длинный джамп. После этого они выходят из состояния assert, и возобновляются вычисления, характерные для адресации в реальном режиме.

    Кроме того, чип BIOS настраивается таким образом, что первая инструкция из BIOS, которая должна быть выполнена, находится в процессоре по адресу 0xffff.fff0. Следовательно, процессор способен выполнить первую инструкцию из региона BIOS в чипе BIOS. В этом регионе содержится так называемая загрузочная прошивка (boot firmware). Примеры загрузочной прошивки – это различные реализации UEFI, coreboot и классический BIOS.
    В самом начале работы загрузочная прошивка переключается в 32-разрядный режим. Этот режим также является «защищённым» — то есть, включается сегментирование, и различными сегментами адресного пространства в процессоре можно управлять с разными правами доступа. Но в загрузочной прошивке будет всего один сегмент, поэтому сегментация, фактически, отключается. Такая ситуация называется «плоским режимом».

    ❯ Ранние инициализации

    Стоит отметить, что на данном этапе загрузочного процесса у нас нет доступа к DRAM (динамической памяти с произвольным доступом). Инициализировать DRAM – одна из основных целей загрузочной прошивки. Но перед инициализацией DRAM необходима некоторая подготовительная работа.

    Вставки микрокода – это своего рода патчи, обеспечивающие корректную работу ЦП. Intel продолжает публиковать микрокодовые патчи для различных ЦП. Загрузочная прошивка задействует эти патчи на очень раннем этапе процесса загрузки. В этом процессе участвует, в том числе, так называемый южный мост, или контроллер ввода-вывода (ICH), или мост контроллера периферии (PCH). Есть и такие операции инициализации, которые должны выполняться специально для ICH. Например, в состав ICH может входить сторожевой таймер, начинающий отсчёт в момент инициализации DRAM. Этот сторожевой таймер нужно отключить первым.

    Разумеется, все эти операции выполняет прошивка, код для которой кто-то должен написать. В современном коде, как правило, используется стек. Но, как было сказано выше, DRAM пока не инициализирована, поэтому у нас в распоряжении нет памяти. Как же написать и выполнить этот код? Нужно работать с кодом без стека. Он или пишется вручную на ассемблере x86, или, как в случае с coreboot, пишется на C, а затем собирается при помощи специального компилятора ROMCC, который преобразует команды C в бесстековые ассемблерные инструкции. Конечно же, при этом налагаются определённые ограничения на код, скомпилированный при помощи ROMCC, и любой код так выполнять не получится. То есть, стек нам нужен как можно скорее.

    На следующем шаге необходимо оборудовать так называемый «кэш в роли оперативной памяти» (CAR). Как правило, загрузочная прошивка устанавливает кэши ЦП таким образом, что их можно временно использовать в качестве ОЗУ. Именно так прошивке удаётся выполнять код, который не является бесстековым, но в нём действуют ограничения по части размеров стека и общего объёма доступной памяти.

    ❯ Инициализация памяти и пакет Intel FSP

    В системах Intel за выполнение инициализации отвечает большой двоичный объект (блоб) под названием Intel Firmware Support Package (FSP). Он предоставляется Intel в двоичной форме. Intel FSP выполняет массу сложной работы, касающейся начальной загрузки процессоров Intel, а не только занимается инициализацией памяти. В принципе, это трёхступенчатый API. Способ взаимодействия загрузочной прошивки с FSP задаётся в виде нескольких параметров и адреса возврата, после чего выполняется переход на стадию FSP. Стадия FSP выполняется с учётом выстьавленных параметров, а потом по адресу возврата выполняется переход обратно в загрузочную прошивку. Это продолжается на протяжении трёх стадий работы с FSP, в следующем порядке:

    • TempRamInit(): здесь частично выполняется инициализация ОЗУ, после чего управление передаётся обратно загрузочной прошивке. Загрузочная прошивка может стронуть несколько действий, а затем перейти к следующей стадии. Дело в том, что на следующем шаге инициализируются чипсет и память, а на это может потребоваться немало времени. Например, на тренировку памяти нужно много времени. Поэтому здесь удобно сделать так, чтобы загрузочная прошивка запустила инициализацию других процессов, например, раскрутила жёсткий диск, которому может потребоваться некоторое время, чтобы стабилизироваться.
    • FspInitEntry(): Именно здесь мы фактически добираемся до работы с DRAM. Также здесь выполняются операции по инициализации других аппаратных компонентов, в частности, PCH и самого ЦП. По завершении этого этапа управление передаётся обратно загрузочной прошивки. Но с этого момента память уже инициализирована, и передача управления и данных происходит иначе, нежели на этапе TempRamInit. После этого этапа прошивка выполняет большинство оставшихся инициализаций – которые описаны в следующем разделе – а потом передаёт управление на следующую стадию FSP.
    • NotifyPhase(): Именно на данном этапе загрузочная прошивка передаёт управление обратно FSP и устанавливает параметры, сообщающие FSP, какие действия нужно совершить, прежде, чем свернуть работу. Те вещи, которые FSP может здесь сделать, платформозависимые, но здесь, например, перечисление PCI-устройств.

    ❯ После инициализации памяти

    Как только DRAM готова, она даёт новый импульс загрузочному процессу. Первое, что делает прошивка – копирует себя в DRAM. Это делается при помощи “memory aliasing” (совмещения страниц в памяти). Это означает, что операции чтения и записи по адресам менее 1 МБ направляются в DRAM и из неё. Затем прошивка устанавливает стек и передаёт управление DRAM.

    Далее выполняются некоторые инициализации, специфичные для платформы, например, конфигурируется GPIO и повторно активируется сторожевой таймер в ICH, который был отключён до инициализации памяти, прокладывая путь к включению прерываний. Участки локального продвинутого контроллера прерываний (LAPIC) имеются в каждом процессоре, то есть, в многопроцессорной системе они локальны для каждого ЦП. LAPIC определяет, как каждое конкретное прерывание доводится до конкретного ЦП. I/O APIC (IOxAPIC) находится внутри ICH, и существует один IOxAPIC для всех процессоров. Также может быть программируемый контроллер прерываний (PIC), предназначенный для использования в реальном режиме. Ещё есть таблица векторов прерываний, содержащая 256 таких векторов. Это указатели на обработчики соответствующих прерываний. С другой стороны, таблица дескрипторов прерываний применяется для хранения векторов прерываний, когда мы работаем в защищённом режиме.

    Затем прошивка устанавливает различные таймеры, зависящие от платформы и от прошивки. Программируемый таймер прерываний (PIT) – это системный таймер, расположенный в IRQ0. Он находится внутри ICH. Таймер событий высокой точности (HPET) также находится внутри ICH, но загрузочная прошивка может его не инициализировать, а позволить ОС установить его, если потребуется. Ещё есть часы (часы реального времени, RTC), которые также находятся в ICH. Есть и другие таймеры, в частности, LAPIC, имеющийся в каждом ЦП. Далее прошивка настраивает кэширование в памяти. В принципе, это сводится к заданию различных характеристик кэша – «обратная запись», «не кэшировать» — для разных диапазонов памяти.

    ❯ Другие процессоры, устройства ввода-вывода и PCI

    Наконец, давайте подключим к работе другие процессоры, поскольку вся описанная выше работа выполнялась на загрузочном процессоре. Для нахождения прикладных процессоров (AP) в том же пакете BSP выполняет инструкцию CPUID. Затем, воспользовавшись своим LAPIC, BSP отправляет каждому AP прерывание SIPI. Каждое SIPI указывает на физический адрес, с которого AP-адресат должен начать выполнение. Стоит отметить, что каждый AP начинает работать в реальном режиме. Следовательно, адрес SIPI обязан быть менее 1 МБ, это максимум адресации в реальном режиме. Обычно, вскоре после инициализации, каждый AP выполняет инструкцию HLT и переходит в состояние останова, ожидая дальнейших инструкций от BSP. Правда, непосредственно перед тем, как ОС берёт на себя управление, AP, предположительно, находятся в состоянии «жду SIPI». В BSP для этого нужно отправить пару внутрипроцессорных прерываний каждому AP.

    Далее переходим к устройствам ввода/вывода, например, встроенному контроллеру (EC) и Super I/O, а после этого к инициализации. В принципе, инициализация PCI сводится к:

    1. Перечислению всех PCI-устройств
    2. Выделению ресурсов для каждого PCI-устройства

    ❯ Передача управления загрузчику ОС

    Прежде, чем передать управление загрузчику, отвечающему за следующую стадию работы (обычно это загрузчик операционной системы, например, GRUB2 или LILO), прошивка задаёт в памяти некоторую информацию, которой затем воспользуется ОС. В состав этой информации входят, в частности, таблицы ACPI (усовершенствованного интерфейса управления конфигурацией и питанием) и карта памяти как таковой. По карте памяти ОС узнаёт, какие диапазоны адресов предназначены для каких целей. Среди таких регионов – общая память для использования в ОС, относящиеся к ACPI диапазоны адресов, зарезервированные адреса (то есть, не используемые ОС), IOAPIC (будут использоваться IOAPIC), LAPIC (будут использоваться LAPIC). Также загрузочная прошивка устанавливает прерывания для SMM (режима системного управления). SMM – это режим эксплуатации процессоров Intel, наряду с Реальным, Защищённым и Длинным (64-разрядным). ЦП входит в режим SMM, получив SMM-прерывание, которое может быть инициировано по целому ряду причин (например, процессор нагрелся до определённой температуры). Прошивка, прежде, чем передать управление загрузчику ОС, также блокирует некоторые регистры и возможности ЦП, чтобы эти показатели нельзя было изменить уже после вступления ОС в работу.

    Сама передача управления загрузчику операционной системы обычно происходит как джамп в соответствующую область памяти. Такой загрузчик ОС как GRUB2 будет действовать на основе записанной в нём конфигурации и, в конце концов, передаст управление операционной системе, например, Linux. В Linux в таком случае обычно используется образ bzImage (большой zImage, а не сжатый bz). Также отметим, что здесь ОС (например, Linux) снова перечислит PCI-устройства и, возможно, продублирует ещё некоторые из тех инициализаций, которые на завершающем этапе выполняла загрузочная прошивка. Обычно Linux выбирает систему, работающую в 32-разрядном режиме при отключенной подкачкой страниц, и выполняет собственные инициализации – например, задаёт страничные таблицы, включает подкачку страниц и переключается в длинный (64-разрядный) режим.

    Возможно, захочется почитать и это:

    • ➤ Крушение Intel продолжается
    • ➤ AMD — вечная канарейка Intel
    • ➤ Как создавалась Bioshock
    • ➤ Пожарная сигнализация из московского метро
    • ➤ Муравьиный алгоритм | Задача коммивояжёра

    Скрытый мир прошивки: изучение процесса загрузки вашего компьютера

    Скрытый мир прошивки: изучение процесса загрузки вашего компьютера

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

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

    ЗАГРУЗОЧНОЕ ПЗУ

    интегральная схема (микросхема), расположенная на материнской плате и хранящая код микропрограммы, отвечающая за загрузку компьютера, называется BOOT ROM. Это название не стандартизировано, поэтому другие разработчики часто называют его FLASH ROM, BIOS FLASH, BOOT FLASH, SPI FLASH и т. д. (такие названия им даются из-за названий технологии, интерфейса и назначения). Не беспокойтесь, эти термины взаимозаменяемы. Код микропрограммы в BOOT ROM выполняется первым при включении компьютера. Он выполняет базовые тесты, инициализирует аппаратное обеспечение, а затем загружает загрузчик ОС с загрузочного устройства, например жесткого диска или USB-накопителя, в память. Этот чип сделан из энергонезависимой памяти (NVM).

    Энергонезависимая память

    Энергонезависимая память – это тип памяти компьютера, который сохраняет свое содержимое даже при отключении питания. Это делает этот тип памяти идеальным для хранения важных данных, которые необходимо сохранить, даже когда компьютер выключен. Кроме того, речь пойдет только о памяти, содержащей код прошивки. Мы не будем говорить о таких хранилищах, как жесткие диски (HDD), твердотельные накопители (SSD), гибкие диски и т. д.

    По сути, мы можем разделить этот тип памяти на следующие группы.

    Программируется один раз
    • Замаскированное ПЗУ: содержимое определяется во время изготовления и не может быть изменено после этого.
    • Программируемое ПЗУ (ППЗУ): В отличие от ПЗУ с масками, этот тип памяти может быть запрограммирован после изготовления. Но все же только один раз.
    Программируется на месте
    • Стираемое программируемое ПЗУ (EPROM): может быть запрограммировано несколько раз, но его содержимое может быть стерто и перепрограммировано с помощью ультрафиолета.

    * Электрически стираемое программируемое (EEPROM): можно многократно перепрограммировать с помощью электрических сигналов.

    * Флэш-память NOR: архитектурно организована в блоки, где данные стираются на блочном уровне и могут быть прочитаны или записаны на байтовом уровне. Доступ к памяти NOR осуществляется напрямую через стандартный интерфейс, такой как параллельный байт, I2C или SPI.

     In the industry, there is a convention to reserve the term **EEPROM** to byte-wise erasable memories compared to block-wise erasable **flash** memories. 

    Для программируемой памяти действует одно правило: стереть перед записью. В такой памяти запись новых данных более сложна, потому что данные хранятся в виде заряда на плавающем затворе (причина большей части просто кроется в физике ячеек памяти). Количество заряда на воротах определяет, хранит ли ячейка «0» или «1».

    Когда вы стираете микросхему флэш-памяти, вы устанавливаете все биты данных, хранящихся на ней, в известное (по умолчанию) состояние, обычно логическую «1». Это позволяет вам, так сказать, начать с чистого листа и запрограммировать новые данные на чип, не сохраняя на нем остатки старых данных. Когда новые данные записываются в микросхему, состояние отдельных битов изменяется с «1» на «0», чтобы представить новые данные.

    Если вы просто запишете новые данные в чип без предварительного их стирания, новые данные будут объединены со старыми данными, что приведет к непредсказуемым результатам. Например, рассмотрим микросхему флэш-памяти с 8 битами памяти, в которой хранится значение «0110 0010». Если вы запишете в чип новые данные «1100 1001» без предварительного их стирания, результирующее состояние чипа будет «0100 0000», что может быть не таким, как вы предполагали.

    Основная путаница связана со словом ROM, которое означает Read Only Memory. Термин «постоянная память» исторически использовался для обозначения памяти, которая является постоянной и не может быть изменена пользователем. Однако по мере развития технологий определение ПЗУ изменилось, и теперь оно часто используется для обозначения памяти, которая предварительно запрограммирована на заводе и не может быть легко изменена конечным пользователем. Но если у пользователя есть желаемые навыки и специализированное оборудование (например, программатор), человек может перепрограммировать чип. Название ROM осталось, несмотря на то, что определение изменилось, как историческая ссылка на первоначальное назначение памяти.

    При применении защиты от записи некоторые типы перепрограммируемых ПЗУ могут временно стать постоянной памятью.

    Это НЕ ВСЕ существующие типы энергонезависимой памяти, но большинство популярных, о которых вы можете услышать случайно. В настоящее время на большинстве системных плат эти микросхемы изготавливаются с использованием технологии NOR Flash.

    Выполнение на месте (XIP)

    Выполнение на месте (XIP) — это метод, который позволяет процессору выполнять код непосредственно из флэш-памяти, не копируя его в энергозависимую память (например, ОЗУ). Это достигается путем сопоставления флэш-памяти с адресным пространством процессора, так что выполнение кода может выполняться непосредственно из флэш-памяти. Таким образом, система может начать выполнение кода как можно скорее, не дожидаясь первой инициализации ОЗУ.

    Подождите. ЦП может связываться с BOOT ROM по протоколу SPI/Parallel/etc? Конечно нет, это просто получение инструкций из системной памяти, запросы к этой области памяти перенаправляются в Intel Direct Media Interface (DMI) или AMD Infinity Fabric (IF) / Unified Media Interface (UMI) (предшественник). Это связь между процессором и чипсетом на материнской плате. В этот момент происходит декодирование адреса с помощью декодеров, расположенных в чипсете, и данные с чипа возвращаются в процессор.

    Когда чип сделан из флэш-памяти NOR, которая поддерживает чтение с произвольным доступом, но не запись с произвольным доступом, возникла одна проблема. Поскольку доступной для записи памяти нет, все вычисления должны выполняться в регистрах процессора. На этом этапе код может быть написан только на языке ассемблера, и он стремится настроить среду для языка высокого уровня (как правило, для язык C). Причина этого в том, что инициализация памяти стала настолько сложной, что было бы сложно писать только на ассемблере. Так как для таких языков требуется как минимум куча и стек, нам нужна перезаписываемая память. Некоторые процессоры имеют SRAM, встроенную в сам чип, но более современный подход заключается в использовании встроенной кэш-памяти в качестве RAM (CAR).

    Кэш-память (CAR)

    Кэш процессора – это высокоскоростная память, в которой хранится копия часто используемых данных и инструкций из основной памяти. Кэш расположен ближе к процессору и состоит из нескольких уровней (L1, L2, L3, . ), причем каждый уровень больше и медленнее предыдущего.

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

    Очистка кэша — это процесс удаления данных из кэша с целью освобождения места для новых данных. Исключение данных может быть инициировано либо системой кэширования (обычно когда кэш заполнен и необходимо сохранить новые данные, либо когда срок жизни данных истек), либо явным запросом.

    Однако, если мы хотим использовать кэш ЦП в качестве ОЗУ, нам нужно настроить кеш для работы в режиме без вытеснения, который также называется без заполнения. Режим. Этот метод предотвращает удаление из-за промаха кэша. Вместо этого кеш обрабатывается как обычная SRAM, и все обращения (чтение/запись) попадают в кеш, а не в основную память. Этот режим можно активировать с помощью инструкций процессора конкретного поставщика.

    Макет & Отображение памяти

    На самом деле BOOT ROM содержит несколько типов микропрограмм. Раз куча прошивок хранится в BOOT ROM, ее нужно как-то организовать, чтобы различать их. Давайте узнаем, как это делается.

    Недескрипторный режим

    Изначально чипсет выполняет прямое сопоставление всего содержимого BOOT ROM с памятью (от 4 ГБ до 4 ГБ — 16 МБ). Как правило, если размер загрузочного ПЗУ меньше 16 МБ, его содержимое повторно отображается. ЦП и прошивка могут читать/записывать во флэш-память без каких-либо ограничений.

    Недескрипторный режим больше не поддерживается новыми чипсетами.

    Intel Flash Descriptor/Режим дескриптора

    В конце концов, в ICH8 Intel представила специальный макет для BOOT ROM. Flash разделен на следующие области:

    * Flash Descriptor (FD) — эта структура данных должна располагаться в начале устройства со смещением 0x10 . Он состоит из одиннадцати разделов, как показано на рисунке ниже:

    Descriptor MAP содержит указатели на другие регионы и размер каждого из них.

    В разделе Компонент содержится информация о флэш-памяти в системе (количество компонентов, плотность каждого, недопустимые инструкции и т. д.).

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

    * BIOS — в память отображается только этот регион.

    * Intel Converged Security and Management Engine (CSME/ME) — прошивка для поддержки различных технологий Intel и ME. * Gigabit Ethernet (GbE) — прямой доступ возможен только через контроллер Gigabit Ethernet. * Данные платформы * Встроенный контроллер (EC)

    Единственными обязательными регионами являются дескриптор Flash и Intel ME.

    Таблица интерфейса встроенного ПО Intel (FIT)

    FIT — это структура данных внутри региона BIOS, содержащая различные записи, описывающие конфигурацию платформы. Каждая запись в таблице имеет размер 16 байт. Первый называется заголовком FIT, второй — записью FIT. Он расположен с помощью указателя FIT по физическому адресу 0xFFFFFFFC0 (4 ГБ – 0x40).

    Эти компоненты должны быть обработаны до выполнения первой инструкции ЦП из вектора сброса. Записи включают обновления микрокода ЦП, Startup ACM, политики загрузки платформы/TPM/BIOS/TXT и другие материалы. Но, по крайней мере, FIT должен включать записи FIT Header и Microcode Update. Таким образом, обычно FIT используется для обновления микрокода перед выполнением вектора сброса.

    Вот как выглядит карта памяти:

    Структура встроенного ПО AMD

    К сожалению, информации гораздо меньше, мне не удалось найти какой-либо просочившейся документации по чипсетам AMD с подробным описанием их компоновки. Поэтому я не могу сказать вам лучше, чем сказано в документации coreboot. Он написан на основе AMD документация, доступная только в рамках соглашения о неразглашении.

    На самом деле, будет достаточно знать, что AMD-аналог Flash Descriptor — это Embedded Firmware Structure, и он содержит указатели на Таблицу каталогов PSP, Таблицу каталогов BIOS, и другие прошивки.

    Инициализация кремния

    Если вы хотели посмотреть, как именно инициализируется современная память и процессор, то я должен вас огорчить. Intel и AMD не спешат публиковать Silicon Initialization Code для сообщества. Поскольку такой информации нет в открытом доступе, они предлагают бинарный дистрибутив необходимого кода инициализации кремния. Это библиотека для разработчиков микропрограмм, содержащая двоичный код для инициализации контроллера памяти, набора микросхем, ЦП и других частей системы.

    Пакет поддержки встроенного ПО Intel (FSP)

    Этот двоичный файл можно разделить на 4 компонента:

    * FSP-T: Настройка среды раннего выполнения («Временная оперативная память»), в которой может выполняться код C. На практике этот двоичный файл устанавливает CAR, но также выполняет некоторую раннюю аппаратную инициализацию, такую ​​как настройка пространства конфигурации с отображением памяти PCIe. * FSP-M: Инициализация постоянной памяти (например, DRAM). * FSP-S: завершение инициализации кремния, включая инициализацию процессора и контроллера ввода-вывода. * FSP-O: дополнительный компонент, обеспечивающий инициализацию OEM-устройств.

    Вот репозиторий двоичных файлов Intel FSP, опубликованный Intel, который вы можете найти на их GitHub. Спецификацию FSP v2.1 можно получить на веб-сайте Intel.

    Общая инкапсулированная программная архитектура AMD (AGESA)

    AGESA для продуктов до семейства 17h называется v5 или Arch2008. В то время исходный код AGESA был открытым, и код был доступен в репозиторий coreboot (устарел после версии 4.18). Спецификацию Arch2008 можно найти на веб-сайте AMD.

    С введением продуктов Family 17h (микроархитектура Zen) AMD не публиковала исходный код AGESA, а только готовые двоичные файлы. решения. Такой преемник называется AGESA v9 и поддерживает семейство 17h и более поздние версии.

    openSIL

    Подробной информации нет, только новости.

    Автономные подсистемы

    Неотъемлемая часть современного процесса загрузки x86, без которой ядра x86 никогда не будут активированы. Поэтому их полностью отключить невозможно. Эти технологии отвечают за инициализацию оборудования, проверку целостности системы, управление питанием и запуск ЦП. Встроенное ПО для этих подсистем загружается и выполняется до, пока главный процессор не начнет выполнение собственного встроенного ПО. Код в таких системах работает независимо от ядер ЦП платформы.

    Пока многие компании, производящие оборудование, внедрили принцип безопасность через неизвестность, ни исходный код, ни документация для этих подсистем недоступны. К счастью, мы знаем, как это влияет на процесс загрузки — см. Последовательности питания оборудования.

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

    Intel Management Engine (ME)

    Intel ME — это отдельный микропроцессор i486/80486, интегрированный в набор микросхем Intel (PCH) с 2008 года. собственное ОЗУ, встроенное ПЗУ, шинные мосты со всеми шинами внутри чипсета (в результате он может получить доступ к сети и даже к основной ОЗУ на ЦП) и так далее. Запускает пользовательскую ОС на основе MINIX.

    Процессор безопасности платформы AMD (PSP)

    AMD PSP — это ядро ​​ARM, основанное на расширении Trustzone, которое вставляется в кристалл ЦП в качестве сопроцессора. Этот чип интегрирован в большинство платформ AMD с 2013 года. Работает под управлением недокументированной проприетарной ОС.

    Последовательности питания оборудования

    Этот процесс, также известный как Последовательность включения питания или Последовательность включения питания, обеспечивает ряд производных уровней напряжения и/или шин блока питания. в определенном порядке, необходимом на платформе. Проще говоря, он включает ряд компонентов платформы в определенном порядке. Процесс зависит от конструкции системы или платформы, но обычно стандартный ПК включает следующие шаги:

    * Вы нажимаете кнопку питания. Но подождите. эта кнопка находится на корпусе компьютера, который не является необходимой частью компьютера. Обычно кнопка питания представляет собой кабель. У нас есть кнопка с одной стороны и переключатель, который мы надеваем на два металлических штыря на материнской плате с другой стороны. Когда мы нажимаем на кнопку, эти штыри соединяются, и через них может проходить электричество. Посмотрите видео ниже о том, как включить компьютер без кнопки питания, если вам интересно.

    * материнская плата посылает сигнал на блок питания (БП).

    * Блок питания получает сигнал, обеспечивает необходимое количество электроэнергии и отправляет сигнал обратно на материнскую плату. * Как только материнская плата получает сигнал питания, она включает компоненты платформы, такие как ядро, часы, набор микросхем, память, различные контроллеры и т. д. * Различные подсистемы, в том числе автономные подсистемы (описанные выше), могут запускаться раньше основного процессора.

    * Системы на базе AMD (для семейства 17h и более поздних версий)

    * PSP выполняет на-чипе BOOT ROM. * PSP находит Таблицу встроенного ПО в выключенном-чипе BOOT ROM и выполняет встроенное ПО PSP. * PSP анализирует таблицу каталогов PSP, чтобы найти этапы ABL и выполнить их. * Этапы ABL инициализируют основную память, находят образ BIOS в BOOT ROM и загружают его в DRAM (распаковывают, если образ сжат).

     This platform has no reason to use CAR because DRAM is already available and PSP loads the firmware image into it. 

    * Системы на базе Intel * Набор микросхем (ICH/PCH) находит Intel Flash Descriptor в BOOT ROM. * Чипсет копирует прошивку CSME во внутреннюю память, где Intel ME может получить к ней доступ, и последний начинает ее выполнение. * Набор микросхем сопоставляет регион BIOS с памятью. * Обновления микрокода, расположенные в Таблице интерфейса встроенного ПО, загружаются в ЦП. Их необходимо применять при каждой загрузке системы. * (необязательно) Если обнаружены модули кода с проверкой подлинности (ACM), то эта запись выполняется.

    * Все это время подается сигнал сброса ЦП, чтобы предотвратить запуск ЦП до того, как другие части системы будут готовы. Когда платформа готова, строка сброса процессора снимается. В многопроцессорной или многоядерной системе один ЦП динамически выбирается в качестве загрузочного процессора (BSP), на котором выполняется весь код инициализации встроенного ПО. Остальные процессоры, называемые на данный момент процессорами приложений (AP), остаются остановленными до тех пор, пока позже они не будут явно активированы прошивкой/ядром.

    * После первого включения ЦП он работает в реальном режиме. Большинство регистров имеют четко определенные значения, включая указатель инструкций (IP), сегмент кода (CS) и кеш дескрипторов, который является копирование каждого дескриптора сегмента внутри процессора, чтобы обеспечить быстрый доступ к памяти сегмента.

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

    Однако GDT не задействован в реальном режиме, поэтому процессор создает записи внутри себя. Регистр селектора CS, используемый для доступа к дескриптору сегмента, загружается с помощью 0xF000 . Базовый адрес CS инициализируется как 0xFFFF_0000 . IP инициализируется как 0xFFF0 .

    Поэтому процессор начинает извлекать инструкции из памяти, расположенной по физическому адресу 0xFFFF_FFF0 ( 0xFFFF_0000 + 0x0000_FFF0 ). Первая инструкция, выполняемая по этому адресу, называется вектором сброса.

    ПРИМЕЧАНИЕ. Этот трюк дает вам доступ к верхнему адресному пространству, однако вы не можете получить доступ к коду ниже адреса 0xFFFF_0000 . Базовый адрес CS остается в этом начальном значении до тех пор, пока микропрограмма не загрузит регистр селектора CS. Это можно сделать, совершив дальний прыжок.

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

    * Адрес находится в разделе энергонезависимой памяти, поэтому ЦП использует метод Execute In Place (XIP). Хотя, если это система на базе AMD, вы, вероятно, читаете из основной памяти.

    * ЦП выполняет код прошивки.

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

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

    В следующей статье мы более подробно рассмотрим BIOS, UEFI и coreboot.

    Ресурсы

    • Загрузка системы с архитектурой Intel, часть I: ранняя инициализация, веб-архив
    • Как загружаются компьютеры
    • ПЗУ, СППЗУ И ТЕХНОЛОГИЯ EEPROM
    • Различия между EEPROM и NOR Flash
    • Нежное введение в Cache-as-Ram на X86 & класс защиты, который был получен от John Butterworth & Класс Ксено Кова «Advanced Intel x86: BIOS и SMM»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *