Данная статья продолжает тему углубленного исследования платформы PC,
архитектуры x86 и связанных с ними современных технологий. Рекомендации по
организации рабочего места, объяснение, почему именно DOS выбрана в качестве
полигона для исследований, комментарии по использованию устройства POST Card при
отладке программ, а также описание целевой аудитории содержатся в ранее
опубликованной статье “64-битный
режим под DOS: исследовательская работа № 1
”.

Разделы 1-7 содержат теоретические сведения. Опытный специалист может
начинать чтение с раздела 8, в котором на ассемблерном уровне рассматривается
практический пример – считывание блока из SMRAM и сохранение в виде двоичного
файла.

 

История вопроса

Режим System Management Mode (SMM) как специальное состояние
процессора, используемое для выполнения функций по управлению платформой,
появился в процессорах Intel и AMD в середине 90-х годов прошлого века.
“Улучшенные” модификации процессоров класса 486 уже поддерживали этот режим. Для
использования SMM, часть системного ОЗУ выделяется под System Management RAM
(SMRAM)
. SMRAM используется для хранения выполняемого кода процедур
поддержки SMM, сохранения и восстановления состояния процессора при переходе в
режим SMM и выходе из него, хранения переменных, связанных с поддержкой SMM, а
также других целей, набор которых определяет разработчик BIOS. Процессор
переходит в режим SMM при получении сигнала запроса на прерывание System
Management Interrupt (SMI)
, генерируемого специальными схемами системной
платы при наступлении контролируемых событий.

Режим SMM был разработан для управления такими объектами и событиями в
системе, существование которых требовалось “скрыть” от ОС, в рамках концепции
взаимодействия ОС и оборудования, характерной для того этапа развития платформы
PC. Такая постановка задачи определила следующие характерные особенности
архитектуры SMM: для хранения адреса процедуры обработки аппаратного прерывания
SMI не используется ни один из векторов в стандартной таблице векторов, в
отличие от всех остальных прерываний. Вместо этого, адрес хранится в специальных
регистрах процессора. Для сохранения и восстановления состояния процессора при
обработке прерывания SMI, не используется стандартный стек, вместо этого
используется память SMRAM, в которой хранятся все данные, необходимые для
поддержки SMM.

Когда BIOS передает управление на загрузку ОС, он настраивает чипсет (в
частности схемы картирования памяти) таким образом, что память SMRAM недоступна
в адресном пространстве. В большинстве платформ для картируемого доступа к SMRAM
используется 128Кбайтное окно по адресам 000A0000h-000BFFFFh. Когда процессор
находится в обычном режиме (не SMM), данный диапазон отображается на шину
ввода-вывода и используется для чтения и записи памяти видеоадаптера. По сигналу
SMI, процессор переходит в режим SMM, после этого на тот же диапазон адресов
будет включена оперативная память (область SMRAM), доступ к видеопамяти временно
закрывается. При выходе из режима SMM после завершения обработки прерывания SMI,
на выше указанный адресный диапазон снова будет включена видеопамять. Таким
образом, память SMRAM “не видна” для ОС и программ.

Внимательный читатель может задать вопрос: а как быть, если процедуре
обработки SMI, выполняемый код которой находится в диапазоне
000A0000h-000BFFFFh, требуется выполнить запись в видеопамять?
Для этого,
программно-управляемая логика картирования обеспечивает дополнительную гибкость,
например, процедура обработки SMI может временно включить режим, при котором
процессорные циклы чтения выполняемого кода в диапазоне 000A0000h-000BFFFFh
направляются на SMRAM, а циклы чтения и записи данных направляются на
видеопамять. Есть и другое решение, которое обусловлено тем, что практически все
современные видеоадаптеры, помимо постраничного доступа к видеопамяти в
диапазоне 000A0000h-000BFFFFh обеспечивают и линейный (плоский) доступ к ней в
диапазоне, находящемся выше 1MB. Адрес и размер этого диапазона устанавливается
механизмами PCI PnP. Использование такого метода не создает рассмотренного выше
конфликта адресов в режиме SMM.

 

Сферы применения режима SMM

Как было сказано выше, режим SMM был разработан для управления такими
объектами и событиями в системе, существование которых требуется “скрыть” от ОС.

Сразу после появления SMM, одной из основных сфер его применения являлся
Power Management, осуществляемый BIOS. При наступлении событий, связанных с
взаимодействием программного обеспечения и оборудования (обращение программ к
заданным портам, генерация прерываний), специальная логика, обычно входящая в
состав чипсета системной платы, генерирует прерывание SMI, процедура обработки
которого, входящая в состав BIOS, собирает статистику использования различных
устройств. На основании результатов этой статистики, устройства, не используемые
в течение заданного интервала времени, отключались. Этим обеспечивалось снижение
общей потребляемой мощности системы. Необходимо отметить, что на сегодня, данная
сфера применения SMM уже не актуальна, так как Power Management в современных
платформах и ОС базируется на спецификации ACPI, которая возлагает на ОС все
обязанности по оптимизации энергопотребления. При этом вместо “спрятанного от
ОС” прерывания SMI, генерируется SCI (System Control Interrupt), которое
использует стандартный контроллер прерываний и таблицу векторов. Подробности в
[19].

Другая сфера применения SMM – эмуляция физически несуществующего
оборудования. Например, есть много DOS программ, которые для ввода с клавиатуры
используют чтение скан-кодов из порта данных контроллера клавиатуры (0060h)
вместо вызова сервисных процедур BIOS. Несмотря на очевидное ухудшение
совместимости, программисты часто использовали такое решение, так как не все
комбинации клавиш можно адекватно распознать, используя сервис BIOS. “Час
расплаты” наступил, когда появились клавиатуры USB, при использовании которых,
скан-код уже не доступен через порт 0060h. Разработчики платформ использовали
SMM для решения возникшей проблемы и обеспечения совместимости USB клавиатур с
DOS средой. При вводе скан-кода по интерфейсу USB, контроллер USB генерирует
SMI. Процедура обработки SMI, входящая в состав BIOS, принимает введенный код и
используя специальную команду контроллера клавиатуры (эмуляция ввода), помещает
его в буфер контроллера. После этого, обработка SMI завершается, а для
программного обеспечения все выглядит так, как при использовании стандартной
клавиатуры: скан-код доступен через порт 0060h и контроллер клавиатуры
генерирует прерывание (IRQ1).

BIOS Setup предоставляет опции для включения эмуляции PS/2 клавиатуры и мыши.
Обычно они называются Keyboard Legacy Support, Mouse Legacy Support.

Как было показано выше, режим SMM и прерывание SMI обеспечивают достаточно
хорошую изоляцию между прерываемой и прерывающей процедурой (не используются
таблица векторов прерываний, стек, обычная оперативная память), поэтому данная
технология может быть применена для написания различных программ мониторинга,
перехвата событий, отладчиков и т.п. Но при этом следует понимать, что
архитектура некоторых системных ресурсов, используемых для поддержки SMM
(например, регистров чипсета) может быть различной в различных платформах.
Поэтому, программа, работающая с SMM, будет совместима только с теми
платформами, поддержку которых предусмотрел разработчик. Еще одна проблема
состоит в том, что регистры процессора и чипсета, управляющие SMM, поддерживают
функцию LOCK, позволяющую запретить изменение состояния указанных регистров,
установив для них статус Read Only, который будет снят только после аппаратного
сброса. Если BIOS, до передачи управления на загрузку ОС, активирует функцию
LOCK (на большинстве платформ, протестированных автором, этого не происходит),
то вмешательство внешней программы в работу SMM, а также чтение и запись SMRAM
внешней программой будут невозможны.

 

Функции компонентов платформы.

Систематизируем выше сказанное. Итак, поддержка SMM сводится к следующей
функциональности процессора, контроллера памяти, подсистемы ввода-вывода и BIOS.

  1. Процессор переходит в режим SMM при обработке прерывания SMI. В
    зависимости от схемотехники и режима функционирования платформы, прерывание
    SMI вызывается специальным сигналом (импульсом на одноименном контакте
    процессора) или сообщением Interrupt Message (со значением Delivery Mode =
    SMI) , передаваемым по системной шине. Прерывание SMI имеет более высокий
    приоритет, чем маскируемое прерывание INT и немаскируемое прерывание NMI. Как
    было сказано выше, при обработке SMI не используется таблица векторов
    прерываний, вместо этого адрес процедуры обработки SMI равен SMBASE+8000h, где
    SMBASE – содержимое одноименного регистра процессора. Возврат из процедуры
    обработки прерывания SMI выполняется инструкцией RSM (resume). В отличие от
    всех остальных прерываний, для сохранения и восстановления состояния
    процессора используется не стек, а специальная область в SMRAM – SMM Save
    State Area. На время выполнения процедуры обработки SMI, процессор
    автоматически включает Big Real Mode, устанавливая лимиты сегментов равными
    4GB, также автоматически обеспечивается игнорирование запрета адресной линии
    A20. То есть, возможна работа с 32-битным адресным пространством
    (00000000h-FFFFFFFFh) в Real Mode. Еще одной важной функцией процессора
    является генерация аппаратных сигналов, на основании которых системная логика
    (чипсет) распознает, что процессор находится в режиме SMM. Нужно это для того,
    чтобы управлять картированием адресного пространства: в обычном режиме на
    диапазон адресов 000A0000h-000BFFFFh должна быть включена видеопамять, а в
    режиме SMM на тот же диапазон должна быть включена SMRAM. Подробности в [1],
    [5], [9], [13], [14], [15].
  2. Контроллер памяти должен анализировать состояние процессора и
    включать в адресное пространство память SMRAM на время нахождения процессора в
    режиме SMM. Также необходимы программно-доступные регистры для временного
    включения специальных состояний и обеспечения дополнительной гибкости.
    Например, для того, чтобы BIOS мог получить доступ к памяти SMRAM из обычного
    режима (не SMM) и инициализировать ее, предусмотрено состояние SMM Space Open,
    в котором память SMRAM доступна в адресном пространстве независимо от
    активности режима SMM.

    Примечание 1. Для систем AMD64 (Socket 754/939/940/AM2/AM3), у которых
    контроллер памяти находится в составе процессора, описанные в этом пункте
    функции, реализованы в составе процессора. Для остальных систем – в составе
    “северного моста” чипсета. Подробности в [6], [13], [14], [15].

    Примечание 2. Режим SMM Space Open использован в предлагаемом ассемблерном
    примере для доступа к SMRAM.
     

  3. Подсистема ввода-вывода отвечает за генерацию сигнала SMI. В
    типовой системной плате, ресурсы, способные генерировать SMI и инициировать
    переход процессора в режим SMM, имеются в составе микросхемы “южного моста” а
    также MIO (Multi Input/Output). При этом примерный список потенциальных
    источников SMI следующий. Контроллер Power Management (SMI используется для
    управления выключением долго не используемых устройств, обработки нажатия
    кнопок ATX Power Switch, Sleep Switch). Контроллер USB (SMI используется для
    эмуляции PS/2 клавиатуры или мыши при использовании USB клавиатуры или мыши).
    Контроллер Hardware Monitoring (SMI используется для сигнализации о различных
    событиях, таких, например как перегрев процессора или остановка вентилятора).
    Также предусмотрен механизм, позволяющий программно инициировать запуск SMI
    для передачи команд от ОС к подсистеме SMM. Обычно для этого используется
    регистр SMI_CMD (синоним - APM_CNT, Advanced Power Management Control Port),
    запись в который вызывает SMI. Подробности в [7], [16], [17], [19].
  4. BIOS при старте платформы должен выполнить инициализацию
    процессора, контроллера памяти и подсистемы ввода-вывода для генерации и
    обработки прерывания SMI при наступлении контролируемых событий, номенклатура
    которых определяется архитектурой платформы, а также установками BIOS Setup.
    BIOS также должен подготовить содержимое памяти SMRAM: код и данные процедуры
    обработки SMI. Отметим, что современные ОС используют технологию ACPI, которая
    предусматривает поддержку Power Management средствами ОС. При загрузке, такие
    ОС переводят платформу в режим ACPI, принимая на себя обязанности по
    управлению платформой. При этом функции SMM частично или полностью
    отключаются.
 

Расширенные реализации. Диапазоны ASeg, TSeg

В данной статье и приведенных далее примерах, при рассмотрении доступа к
памяти SMRAM, используется диапазон адресов 000A0000h-000BFFFFh, расположенный
ниже 1MB (A-Segment). Вместе с тем, современные платформы также поддерживают
доступ к SMRAM в диапазоне адресов выше 1MB (T-Segment). Его планируется
рассмотреть в последующих публикациях. Подробности в [6], [13] ,[14], [15].

 

Замечания по совместимости

Необходимо помнить, что архитектура рассматриваемых ниже регистров
контроллера памяти различается в различных платформах. Поэтому рассмотренные
ниже примеры работоспособны только для указанных чипсетов и процессоров. В
приведенном примере, автор не ставил задачу создания универсальной программы
работы с SMRAM, так как пример получился бы слишком громоздким: потребуется база
данных по всем чипсетам и процессорам. Вместе с тем, заинтересованный читатель
может добавить в приведенный исходный текст поддержку своей платформы. Напомним,
что для систем AMD64 (Socket 754/939/940/AM2/AM3), у которых контроллер памяти
находится в составе процессора, для управления SMRAM нужна поддержка различных
типов процессоров. Для остальных систем – различных типов “северных мостов”
чипсетов. Своеобразным исключением является платформа AMD Socket A (синоним
Socket 462). Контроллер памяти здесь находится в составе “северного моста”
чипсета и трансляцией процессорных обращений на шину памяти и шину ввода-вывода
управляет “северный мост”. Но выбор одной из двух этих шин осуществляется в
соответствии с MTRR (Memory Type Range Registers) атрибутами, которые
формируются на основании содержимого MTRR-регистров процессора и передаются от
процессора к чипсету. Поэтому для управления картированием памяти SMRAM на
данных платформах программировать требуется регистры процессора, несмотря на то,
что контроллер памяти находится в чипсете. Подробности в [6], [13], [14], [15].

 

Источники информации

Электронные документы, доступные на сайте
developer.intel.com.

1) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 1:
Basic Architecture. Order Number 253665-023US.
2) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2A:
Instruction Set Reference, A-M. Order Number 253666-023US.
3) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 2B:
Instruction Set Reference, N-Z. Order Number 253667-023US.
4) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3A:
System Programming Guide, Part 1. Order Number 253668-023US.
5) Intel 64 and IA-32 Architectures Software Developer’s Manual. Volume 3B:
System Programming Guide, Part 2. Order Number 253669-023US.
6) Intel 915G/915P Express Chipset Datasheet. Document Number 301467-001.
7) Intel I/O Controller Hub 6 (ICH6) Family Datasheet. Document Number
301473-001.

Электронные документы, доступные на сайте
developer.amd.com.

8) AMD64 Architecture Programmer’s Manual. Volume 1: Application Programming.
Publication No. 24592.
9) AMD64 Architecture Programmer’s Manual. Volume 2: System Programming.
Publication No. 24593.
10) AMD64 Architecture Programmer’s Manual. Volume 3: General-Purpose and System
Instructions. Publication No. 24594.
11) AMD64 Architecture Programmer’s Manual. Volume 4: 128-Bit Media
Instructions. Publication No. 26568.
12) AMD64 Architecture Programmer’s Manual. Volume 5: 64-Bit Media and x87
Floating-Point Instructions. Publication No. 26569.
13) BIOS and Kernel Developer’s Guide for AMD Athlon 64 and AMD Opteron
Processors. Publication No. 26094.
14) BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors.
Publication No. 32559.
15) BIOS and Kernel Developer’s Guide (BKDG) For AMD Family 10h Processors.
Publication No. 31116.

Электронные документы, доступные на сайте
winbond.com.tw.

16) Winbond LPC I/O W83627THF.

Электронные документы, доступные на сайте
ite.com.tw.

17) IT8712F Environment Control – Low Pin Count Input/Output (EC-LPC I/O).

Электронные документы, доступные на сайте
pcisig.com.

18) PCI BIOS Specification. Revision 2.1.

Электронные документы, доступные на сайте
acpi.info.

19) Advanced Configuration and Power Interface Specification. Hewlett-Packard
Corporation, Intel Corporation, Microsoft Corporation, Phoenix Technologies
Ltd., Toshiba Corporation. Revision 3.0.

 

Книги

20) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО “ГРАНАЛ” 1993.
21) В.Г. Артюхов, А.А. Будняк. В.Ю. Лапий. С.М. Молявко, А.И. Петренко.
Проектирование микропроцессорной электронно-вычислительной аппаратуры.
Справочник. Киев “Тэхника” 1988.
22) К. Г. Самофалов, О.В. Викторов. Микропроцессоры. Библиотека инженера. Киев
“Тэхника” 1989.
23) 2B ProGroup: В.А. Вегнер, А.Ю. Крутяков, В.В. Серегин, В.А. Сидоров, А.В.
Спесивцев. Аппаратура персональных компьютеров и ее программирование. IBM
PC/XT/AT и PS/2. Москва “Радио и связь” 1995.

Оставить мнение