Опис роботи програми

Як і в раніше опублікованих статтях даного циклу, з метою монопольного та безперешкодного взаємодії програми з обладнанням при роботі з пропонованим прикладом, автор застосував "древню" технологію налагодження під 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.
Електронні документи, доступні на сайті wwwhypertransport.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.