Описание работы программы

Как и в ранее опубликованных статьях данного цикла, в целях монопольного и
беспрепятственного взаимодействия программы с оборудованием при работе с
предлагаемым примером, автор применил "древнюю" технологию отладки под DOS.
Аргументация такого шага и рекомендации по организации рабочего места приведены
в ранее опубликованной статье "64-битный режим под DOS: исследовательская работа
№ 1
". Данный пример демонстрирует работу с регистрами чипсета, управляющими
доступом к памяти SMRAM. Вопросы работы с ресурсами оборудования из среды
Windows выходят за рамки данной статьи.

Программа детектирует наличие блока Extended SMRAM, и если этот блок
присутствует, визуализирует его адрес, затем сохраняет содержимое в файле
ESMRAM.BIN. Если файл с таким именем уже существует, он будет переписан. Так как
регистры управления SMRAM по-разному реализованы в каждой платформе, для
обеспечения универсальности необходимо детектировать чипсет и использовать
различные процедуры поддержки для различных платформ. В текущей версии программы
эта задача решена для частного случая – поддерживается только чипсет Intel P965.
Эксперименты проводились на материнской плате Gigabyte GA-965P-S3. Используя
предлагаемый пример как образец, заинтересованный читатель может расширить
номенклатуру поддерживаемых платформ, обратившись, например, к документам [4-7],
[12].

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

Прилагаемый каталог WORK содержит следующие файлы:

ASM_TD.BAT – обеспечивает ассемблирование, линковку и запуск программы под
отладчиком. При запуске TASM и TLINK используются опции, обеспечивающие
добавление отладочной информации в EXE файл и отладку с просмотром исходного
текста программы.

ASM_EXE.BAT – обеспечивает ассемблирование и линковку. Генерируется EXE файл.

R_ESMRAM.ASM – основной модуль программы. Проверяет условия запуска программы,
детектирует чипсет и анализирует его текущее состояние. Если процессор находится
в реальном режиме, чипсет распознан, память Extended SMRAM используется и не
блокирована, программа выполняет сохранение блока Extended SMRAM в файле
ESMRAM.BIN.

DOSMSG.INC – процедура вывода строки на экран с использованием функций DOS.

NUMPRINT.INC – библиотека для визуализации шестнадцатеричных и десятичных чисел.
Диапазон адресов Extended SMRAM визуализируется в шестнадцатеричном виде, размер
диапазона – в десятичном виде.

PCIBIOS.INC – библиотека для чтения и записи регистров конфигурационного
пространства PCI. Используется при работе с регистрами чипсета.

A20.INC – Библиотека для управления и контроля состояния адресной линии A20 с
использованием выходного порта контроллера клавиатуры.

BIGREAL.INC – Библиотека поддержки режима Big Real Mode, для использования
32-битных адресов в диапазоне 0-4 Гб. Этот режим, как и управление адресной
линией A20, необходимы в данной программе для доступа к Extended SMRAM.

DATASEGS.INC – сегменты данных, адресуемые в реальном режиме с использованием
16-битных адресов: сегмент для хранения переменных и текстовых строк (DATA_16),
буфер для чтения SMRAM (BUFFER_16), а также сегмент стека (STACK_16). Базовый
адрес сегмента BUFFER_16 выровнен на границу параграфа (кратен 16), это дает
возможность использовать нулевой стартовый адрес указателя, и обеспечивает
некоторый прирост производительности при операциях пересылки блоков данных.

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

Рассмотрим выполнение основного модуля. Нумерация пунктов данного описания
соответствует нумерации пунктов комментариев в исходном тексте — файле
WORK\r_esmram.asm.

1) Установка адреса стека, загрузка регистров SS и SP.

2) Проверка режима работы процессора. Программа требует Real Mode, так как
взаимодействует с аппаратными ресурсами платформы. Если процессор в Protected
Mode, завершаем работу с сообщением об ошибке.

3) Детектирование чипсета. Вначале проверяем наличие PCIBIOS, затем считываем
регистры конфигурационного пространства Vendor ID и Device ID микросхемы
"северного моста" чипсета. Если Vendor ID=8086h, Device ID=29A0h, чипсет Intel
P965 детектирован, продолжаем выполнение. Иначе завершаем работу с сообщением об
ошибке. Подробности в [13-14].

4) Детектирование статуса Extended SMRAM. Считываем регистры конфигурационного
пространства SMRAM Control Register и Extended SMRAM Control Register.
Проверяем, что бит Global SMRAM Enable (бит 3 регистра SMRAM Control Register)
установлен в "1". Это означает, что SMRAM используется. Также проверяем, что бит
TSEG Enable (бит 0 регистра Extended SMRAM Control Register) установлен в "1".
Это означает, что Extended SMRAM используется. Затем проверяем, что SMRAM не
блокирована, то есть бит SMM Space Locked (бит 4 регистра SMRAM Control
Register) установлен в "0". Если память Extended SMRAM не используется или
блокирована, завершаем работу с сообщением об ошибке. Подробности в [1].

5) Установка адреса сегмента данных, загрузка регистра DS. Сегмент DATA_16
содержит переменные, константы и текстовые строки.

6) Определение размера Extended SMRAM. Для этого анализируем биты TSEG Size
(биты 2,1 регистра Extended SMRAM Control Register). Рассматриваемый чипсет
Intel P965 поддерживает значения размера 1, 2 и 8 MB.

7) Определение базового адреса Extended SMRAM. Считываем регистр TSEG Memory
Base, содержимое которого численно равно адресу.

8) Дополнительная верификация размера Extended SMRAM. Считываем регистр TOLUD
(Top of Low Usable DRAM), по содержимому которого определяем верхнюю физическую
границу диапазона доступа к оперативной памяти. Разность между адресом верхней
физической границы оперативной памяти и базовым адресом Extended SMRAM является
размером Extended SMRAM. Сравниваем это значение с полученным в пункте 6 и
сохраняем для последующего использования меньшее из двух значений размера.

9) Подготовка и вывод строки, описывающей начальный адрес, конечный адрес и
размер блока Extended SMRAM.

10) Вывод строки с запросом к пользователю: ESC-выход без сохранения файла,
ENTER-сохранить Extended SMRAM в файле ESMRAM.BIN. Ожидание и обработка ввода с
клавиатуры.

11) Создание файла ESMRAM.BIN.

12) Установка позиции курсора для отображения адресов при сохранении файла
ESMRAM.BIN.

Пункты 13-20 образуют цикл, используемый для сохранения Extended SMRAM в файле.
За одну итерацию сохраняется 32 килобайта. Полный размер Extended SMRAM в
зависимости от конфигурации составляет 1-8 мегабайт.

13) Отображение адресов текущего сохраняемого блока.

14) Подготовка к 32-битной адресации. Разрешаем адресную линию A20 и включаем
режим Big Real Mode. Это необходимо для доступа к памяти Extended SMRAM, так как
она расположена выше 1MB. Исходное состояние линии A20 сохраняем для
последующего восстановления.

15) Открытие SMRAM. Устанавливаем бит SMM Space Open в "1" (бит 6 регистра SMRAM
Control Register). Это обеспечивает такое состояние "северного моста" чипсета,
при котором все обращения в диапазоны адресов Compatible SMRAM и TSEG будут
направляться на шину оперативной памяти. Исходное значение указанного регистра
сохраняем для последующего восстановления. Предварительно запрещаем прерывания,
так как в указанном состоянии чипсета, запуск процедур обработки прерываний
может привести к сбою.

16) Копирование 32-килобайтного блока из региона TSEG в транзитный буфер.
Выполняется инструкция REP MOVS с 32-битной адресацией. Предварительно
выполняется инструкция WBINVD, обеспечивающая очистку кэш-памяти. Отметим, что в
кэш-памяти могла остаться информация, прочитанная из региона TSEG до открытия
SMRAM. Если не выполнить очистку, процессор будет использовать "устаревшую"
копию TSEG, находящуюся в кэш-памяти вместо физического чтения TSEG.

17) Восстановление исходного значения регистра SMRAM Control Register. После
этого прерывания разрешаются.

18) Выключение режима Big Real Mode и восстановление исходного состояния
адресной линии A20.

19) Содержимое транзитного буфера, в который при выполнении пункта 16 была
скопирована очередная 32-килобайтная порция данных из региона TSEG, дописываем в
файл ESMRAM.BIN, созданный при выполнении пункта 11.

20) Организация цикла, увеличиваем адрес на 32 килобайта и переходим к пункту
13, пока не будет обработан весь регион TSEG.

21) Закрытие файла ESMRAM.BIN.

22) Выдача сообщения об успешном завершении программы и выход в DOS.

23) Точка выхода для прерывания работы программы по нажатию ESC.

Пункты 24-35 обеспечивают аварийное завершение программы. Сюда передается
управление при различных ошибках. Выполняется выдача сообщения об ошибке и выход
в DOS. Если ошибка возникла в момент, когда состояние системных ресурсов
(например, адресной линии A20) было изменено, перед выходом в DOS выполняется
также восстановление исходного состояния.

После выполнения программы, если память Extended SMRAM используется и не
заблокирована, на диске появится файл ESMRAM.BIN, размером от 1 до 8 Мегабайт.
Размер и содержимое файла зависят от того, как BIOS на данной платформе
использует ESMRAM.

 

Если SMM Locked

Как было показано выше, если установлен бит SMM Space Locked (бит 4 регистра
SMRAM Control Register), то установить состояние SMM Space Open и прочитать
содержимое Extended SMRAM невозможно. Программно обнулить бит SMM Space Locked
также невозможно, он обнуляется только при аппаратном сбросе. Можно ли обойти
эту защиту?

Один из вариантов – перепрограммирование регистров DRB (DRAM Row Boundary), с
помощью которых каждому физическому банку памяти присваивается свой диапазон
адресов. Подробности в [1]. Таким образом, можно добиться того, что регион
оперативной памяти, содержащий SMRAM "появится" в таком регионе адресного
пространства, который не защищен логикой поддержки SMM. Но сделать это
достаточно сложно из-за многочисленных побочных эффектов, так как все, что
находится в оперативной памяти, включая ОС, приложения и саму программу,
выполняющую эту операцию, будет искажено на время "измененного состояния чипсета", а возможно и после восстановления исходного состояния. Конечно, наша
программа может, например, переписать себя в видео память или заблокироваться в
кэш-памяти и таким образом пережить сбой оперативной памяти. Автор планирует
описать такую процедуру в последующих публикациях…

 

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

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

1) Intel P965 Express Chipset Family Datasheet – For the Intel 82P965 Memory
Controller Hub (MCH). Document Number: 313053-001.
2) Intel I/O Controller Hub 8 (ICH8) Family Datasheet – For the Intel 82801HB
ICH8 and 82801HR ICH8R I/O Controller Hubs. Document Number: 313056-001.
3) Intel Core 2 Extreme Processor X6800 and Intel Core2 Duo Desktop Processor
E6000 and E4000 Sequences Datasheet. Document Number: 313278-004.
4) Intel Core i7 Processor Extreme Edition and Intel Core i7 Processor Datasheet,
Volume 1. Document Number: 320834-001.
5) Intel Core i7 Processor Extreme Edition and Intel Core i7 Processor Datasheet,
Volume 2. Document Number: 320835-002.

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

6) BIOS and Kernel Developer’s Guide for AMD NPT Family 0Fh Processors.
Publication No. 32559.
7) BIOS and Kernel Developer’s Guide (BKDG) for AMD Family 10h Processors.
Publication No. 31116.
8) AMD Functional Data Sheet, 754 Pin Package. Publication # 31410.
9) AMD Functional Data Sheet, 939 Pin Package. Publication # 31411.
10) AMD Functional Data Sheet, 940 Pin Package. Publication # 31412.

Электронные документы, доступные на сайте
www.hypertransport.org.

11) HyperTransport I/O Link Specification. Revision 3.00. Document #
HTC20051222-0046-0008.

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

(Информация на данном сайте более полная, чем на "родных" сайтах
производителей указанных микросхем.)
12) VIA P4X400 Chipset. VT8754 Single-Chip North Bridge. Для поиска документа
набирать строку "P4X400", "P4X533" или "VT8754".

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

Документы [14], [15] на сайте pcisig.com доступны только для членов PCI
Special Interest Group. Воспользовавшись поисковыми системами, можно найти
данные документы для свободной загрузки.
13) PCI BIOS Specification. Revision 2.1.
14) PCI Local Bus Specification. Revision 3.0.
15) PCI-to-PCI Bridge Architecture Specification. Revision 1.1.

 

Книги

16) В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование.
Москва ТОО "ГРАНАЛ" 1993.
17) М. Гук. Аппаратные средства IBM PC. Энциклопедия. Санкт-Петербург,
издательство "Питер" 2006.

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

Check Also

Как сделать игру. Выбираем движок и пишем клон тех самых «танчиков»

С каждым днем игры становятся все сложнее и навороченнее. Быть инди, а точнее соло-разрабо…