Содержание статьи
Пример 1. Реализация картирования SMRAM на платформе Intel.
Рассмотрим регистр управления доступом к SMRAM, входящий в состав микросхемы
Intel 82915P (это “северный мост” чипсета Intel 915). 8-битный регистр System
Management RAM Control имеет координаты Bus=0, Device=0, Function=0,
Register=9Dh в конфигурационном пространстве PCI. Подробнее о конфигурационном
пространстве см. [18]. Полное описание микросхемы 82915P приведено в [6].
Таблица 1 содержит побитное описание регистра. Расшифровка значения поля
описания атрибутов:
R/W/L – Read/Write/Lockable. Бит доступен для чтения и записи,
но при установке бита D_LCK=1 становится доступным только для чтения.
RO – Read Only. Бит доступен только для чтения.
Таблица 1. Формат регистра System Management RAM Control микросхемы Intel
82915P.
Атрибут | Название | Комментарий | |
7 | - | - | Зарезервирован, не используется. |
6 | R/W/L Default=0 |
D_OPEN | При D_OPEN=1, на диапазон адресов 000A0000h-000BFFFFh включена память SMRAM независимо от того, находится ли процессор в режиме SMM. Этот режим BIOS использует при старте платформы для инициализации SMRAM. При D_OPEN=0, SMRAM доступна только в режиме SMM, иначе на указанный диапазон включена видеопамять. Этот режим BIOS устанавливает при передаче управления на загрузку ОС. Одновременная установка битов D_OPEN=1 и D_CLS=1 недопустима. |
5 | R/W/L Default=0 |
D_CLS | При D_CLS=1, на диапазон адресов 000A0000h-000BFFFFh в режиме SMM включена видеопамять для циклов чтения и записи данных и SMRAM для чтения выполняемого кода. Такой вариант картирования удобен, когда процедура, работающая в SMM, должна выполнить запись информации в видеопамять, например для вывода информации на экран. При CLS=0, на указанный диапазон в режиме SMM всегда включена память SMRAM, независимо от того, считывает процессор выполняемый код или обращается к данным. |
4 | R/W/L Default=0 |
D_LCK | При установке D_LCK=1 устанавливается аппаратная защита от записи регистров управления картированием SMRAM. Биты описываемого регистра, а также некоторых других регистров микросхемы 82915P переводятся из статуса Read/Write в статус Read Only. Бит D_OPEN принудительно переводится в “0”.Снятие данной защиты происходит только по аппаратному сбросу. Режим D_LCK=1 может быть использован для защиты подсистемы SMM от несанкционированного вмешательства различных программ. |
3 | R/W/L Default=0 |
G_SMRAME | Global SMRAM Enable. При установке G_SMRAME=1 разрешено использование SMRAM в режиме SMM. При установке G_SMRAME=0 память SMRAM недоступна независимо от состояния процессора. |
2,1,0 | RO Default=010 |
C_BASE_SEG | Compatible SMM Space Base Segment. Выбор расположения SMRAM. Двоичный код 010b означает диапазон 000A0000h-000BFFFFh. Остальные значения не используются. |
Пример 2. Реализация картирования SMRAM на платформе AMD.
Рассмотрим регистры процессора, управляющие картированием SMRAM в процессорах
AMD. В таблице 2 перечислены биты, актуальные для рассматриваемого ниже примера
- осуществления доступа к SMRAM из собственной программы. Биты указанных
регистров, не имеющие отношения к данной предметной области, не описаны.
Детальное описание указанных регистров, описание всех ресурсов, связанных с SMM
и другие подробности для платформы AMD рассмотрены в [9], [13], [14], [15].
Напомним, что пространство регистров MSR (Model-Specific Registers) доступно
посредством инструкций RDMSR и WRMSR. Инструкция RDMSR считывает MSR, адрес
которого указан в ECX. 64-битный результат чтения генерируется EDX:EAX
(EDX=High, EAX=Low). Инструкция WRMSR записывает 64-битное значение EDX:EAX
(EDX=High, EAX=Low) в MSR, адрес которого указан в ECX.
Расшифровка значения поля описания атрибутов:
R/W/L – Read/Write/Lockable. Бит доступен для чтения и записи,
но при установке бита SMMLOCK=1 становится доступным только для чтения.
R/W – Read/Write. Бит доступен для чтения и записи.
RO – Read Only. Бит доступен только для чтения.
Таблица 2. Управляющие биты, актуальные для операции картирования SMRAM на
платформе AMD.
Адрес MSR (hex) | Название регистра | Атрибут битов | Название битов | Комментарий | |
00000259 | MTRRfix16K_A0000 | 3, 11, 19, 27, 35, 43, 51, 59 | R/W | WrDRAM | Биты управления трансляцией циклов записи. |
00000259 | MTRRfix16K_A0000 | 4, 12, 20, 28, 36, 44, 52, 60 | R/W | RdDRAM | Биты управления трансляцией циклов чтения. |
C0010010 | SYSCFG | 19 | R/W | MtrrFixDramModEn | Бит разрешения доступа к MTRR атрибутам WrDRAM, RdDRAM. |
C0010015 | HWCR | 0 | R/W/L | SMMLOCK | Бит блокировки SMM. |
C0010113 | SMM_MASK | 0 | R/W/L | AValid | Бит управления статусом региона A0000h-BFFFFh. |
Обясним назначение регистров и битов более детально.
Регистр MTRRfix16K_A000 управляет статусом региона
000A0000h-000BFFFFh. Данный регион разбит на 8 страниц по 16 Кбайт каждая.
Каждой странице поставлен в соответствие один байт в указанном регистре, то есть
страница A0000h-A3FFFh описывается байтом D[7-0], страница A4000h-A7FFFh байтом
D[15-8], … , страница BC000h-BCFFFh байтом D[56-63]. Подробности приведены в
[9], [13], [14], [15]. В контексте рассматриваемой темы картирования SMRAM, нас
интересуют биты D4=RdDRAM, D3=WrDRAM каждого байта, которые управляют
трансляцией циклов чтения и записи на шину ввода-вывода (бит=0) или памяти
(бит=1).
Бит MtrrFixDramModEn регистра SYSCFG управляет доступностью
рассмотренных выше битов RdDRAM и WrDRAM для чтения и записи. 0=запрещено,
1=разрешено.
Бит SMMLOCK регистра HWCR управляет блокировкой системных ресурсов,
имеющих отношение к поддержке SMM, с целью предотвращения несанкционированного
вмешательства со стороны программ. При установке SMMLOCK=1 биты, управляющие
картированием SMRAM, приобретают статус Read Only. Снятие защиты происходит
только по аппаратному сбросу.
Бит AValid регистра SMM_MASK управляет специальным статусом диапазона
000A0000h-000BFFFFh. При AValid=0 указанный диапазон имеет обычный статус и
подчиняется механизмам картирования, реализованным выше описанными битами
RdDRAM, WrDRAM регистров MTRR. При AValid=1 диапазон 000A0000h-000BFFFFh имеет
специальный статус SMRAM. Одним из следствий этого является то, что данный
диапазон не подчиняется атрибутам MTRR, память не доступна для чтения и записи,
диапазон отображается на шину ввода-вывода и через него доступна видеопамять.
При этом оперативная память в данном диапазоне появляется только в режиме SMM.
Систематизируем сказанное. В нашем примере ставится задача прочитать SMRAM,
находясь не в режиме SMM. Программа должна установить AValid=0, обеспечив
подчинение диапазона 000A0000h-000BFFFFh атрибутам MTRR, затем установить
атрибуты MTRR, обеспечивающие картирование указанного диапазона на шину
оперативной памяти.
Описание работы программы
Прилагаемый каталог WORK содержит следующие файлы:
ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы под
отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл.
ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется EXE файл.
RD_SMRAM.ASM – основной модуль программы.
DOSMSG.INC – процедура вывода строки на экран с использованием сервиса DOS.
CPUID.INC – процедура проверки наличия поддержки процессором инструкции
CPUID.
SMMINTEL.INC – процедуры картирования SMRAM для платформ с процессорами Intel
и чипсетом Intel 915P. Модуль содержит 3 подпрограммы: детектирование платформы,
картирование SMRAM и восстановление состояния чипсета после картирования SMRAM.
Сюда можно добавлять поддержку новых платформ для Intel. Используемые здесь
системные ресурсы детально описаны выше (пункт 6 теоретической части).
SMMAMD.INC – процедуры картирования SMRAM для платформ с процессорами AMD
(Family 06h, 0Fh). Модуль содержит 3 подпрограммы: детектирование платформы,
картирование SMRAM и восстановление состояния процессора после картирования
SMRAM. Сюда можно добавлять поддержку новых платформ для AMD. Используемые здесь
системные ресурсы детально описаны выше (пункт 7 теоретической части).
DATASEGS.INC – сегменты данных: сегмент для хранения переменных, сегмент с
текстовыми строками, буфер для чтения SMRAM, а также сегмент стека.
При возникновении противоречия между наглядностью и оптимальностью кода,
автор выбирал наглядность. Код может быть модифицирован и оптимизирован в
соответствии со спецификой конкретной задачи. При добавлении поддержки новых
платформ, рекомендуется использовать таблицу в формате, например Device ID 1,
Адрес процедуры 1, Device ID 2, Адрес процедуры 2, и т.д.
Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания
соответствует нумерации пунктов комментариев в исходном тексте - файле
WORK\rd_smram.asm.
1) Контрольная точка 00h – начало выполнения программы. Вывод в порт 80h кода
00h.
2) Установка SS:SP для адресации стека.
3) Проверяем, что процессор в реальном режиме (MSW.0=0), иначе уходим на
генерацию сообщения об ошибке и завершение программы.
4) Детектирование платформы. Вызываем подпрограммы Check_Handler_1 (поддержка
Intel), Check_Handler_2 (поддержка AMD), которые анализируют конфигурацию и если
детектирована поддерживаемая платформа, возвращают флаг переноса CF=0. Иначе
возвращается CF=1. Если ни одна из подпрограмм не распознала свою платформу,
уходим на генерацию сообщения об ошибке и завершение программы.
5) Вызываем подпрограмму Open_SMRAM_Handler, которая обеспечит включение
оперативной памяти SMRAM на диапазон 000A0000h-000BFFFFh. Напомним, что исходно
там находится видеопамять. На время работы в таком контексте, прерывания
запрещаем. Вызов подпрограммы выполняется косвенно, по адресу, подготовленному
на шаге 4 в соответствии с типом платформы.
6) Копируем 128 Кбайт из SMRAM в транзитный буфер, находящийся в обычной
памяти.
7) Восстанавливаем исходное картирование диапазона 000A0000h-000BFFFFh и
разрешаем прерывания. Вызов подпрограммы Restore_SMRAM_Handler выполняется
косвенно, по адресу, подготовленному на шаге 4 в соответствии с типом платформы.
8) Содержимое буфера, в который был скопирован диапазон SMRAM, сохраняем в виде
файла SMRAM.BIN размером 128 Кбайт. Если файл уже существует, он переписывается
без предупреждения.
9) Выход с сообщением о нормальном завершении программы.
10) На эту точку приходит управление при возникновении ошибок. Выход с
сообщением об ошибке.
Так как предлагаемая программа является “полуфабрикатом”, необходимо учесть
следующее:
1) Аппаратные прерывания запрещены на время копирования 128К блока из SMRAM.
Для упрощения примера автор выполнил пересылку за 1 сеанс работы в состоянии
SMRAM OPEN. Вместе с тем, для уменьшения латентности обслуживания прерываний,
можно разбить 128К блок на несколько частей и разрешать прерывания между
пересылками этих частей. Разумеется, перед тем как разрешать прерывания, нужно
восстановить нормальное картирование, вызвав Restore_SMRAM_Handler, а перед тем,
как продолжить копирование SMRAM, установить состояние SMRAM OPEN, вызвав
Open_SMRAM_Handler.
2) Примененная инструкция CLI запрещает только маскируемые прерывания. Данная
версия программы не защищена от ситуаций, когда во время действия состояния
SMRAM OPEN возникнет прерывание NMI или SMI (маловероятно, но возможно). Это
может привести к сбою. Для обеспечения полной корректности, необходимо добавить
запрет NMI и SMI. Для этого потребуются процедуры, специфичные для конкретной
платформы (процессора и чипсета).
Комментарии к результатам. Файл SMRAM.BIN.
Содержимое результирующего двоичного файла SMRAM.BIN существенно зависит от
платформы, в частности от того, как BIOS использует рассмотренную область SMRAM.
В большинстве случаев, точка входа в SMI Handler находится по адресу 000A8000h,
что соответствует смещению 8000h в файле SMRAM.BIN, при этом первая инструкция
обычно JMP NEAR (0E9h) или JMP FAR (0EAh). На некоторых платформах автор
обнаруживал области, содержимое которых изменяется после сеанса работы в Windows
и перезагрузки, то есть данные, которые записал Windows, не были затерты BIOS-ом
при перезапуске.
Обнаруживались и неинициализированные области. Пример: есть 2 полностью
одинаковых DIMM, ставим первый, считываем SMRAM, затем ставим вместо него второй
(в тот же слот), считываем SMRAM. После этого сравниваем результаты считывания и
обнаруживаем области, имеющие различное содержимое. То есть BIOS не
инициализировал эти области, и там осталось содержимое памяти после включения
питания, зависящее от экземпляра DIMM.
Можно ли использовать это свойство для того, чтобы оставить в памяти данные,
которые “переживут” перезагрузку? В ряде частных случаев – да, а в общем случае
– нет. Во-первых, не на всех платформах в SMRAM есть области, которые BIOS не
инициализирует, а во-вторых, при перезапуске платы и перенастройке контроллера
памяти есть вероятность искажения данных, так как пауза между циклами
регенерации динамического ОЗУ во время перенастройки контроллера памяти может
превысить допустимое значение, особенно если это перезапуск по кнопке RESET.
Также не следует забывать и о том, что когда мы записываем в SMRAM свои данные,
мы должны использовать области, не используемые BIOS, чтобы не нарушить работу
BIOS.
Но остановят ли все эти трудности истинного хакера …?
Источники информации
Электронные документы, доступные на сайте
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.