Карта сайта Хакер в RSS Энциклопедия Хакера PDA версия сайта Почтовые рассылки Хакера    Хакер в Twitter Хакер в ВКонтакте Приложение Хакер для Facebook Хакер на Formspring.me
Журнал Новости Форум Видео Life Xakep Live (блоги)
Bugtrack Статьи Блог Поиск English
Взлом как образ мысли Взлом как образ мысли
Интервью с человеком, который, как оказалось, является не только талантливым пентестером в одной из крупных ИБ-компании, но и хакером-ветераном, который уверенными шагами вышел на свет и прикоснулся к истории российской хак-сцены....
Полный гид по накрутке онлайн-голосований Полный гид по накрутке онлайн-голосований
Конкурсы с голосованием привлекают большое количество посетителей, а трафик, как известно, — это деньги. Особый интерес вызывают конкурсы, где за победу предлагаются лакомые призы....

Устройства системной поддержки: исследовательская работа № 8

Bookmark and Share

Детектирование устройств с использованием ACPI

Во времена DOS и систем IBM PC/XT/AT многие системные устройства, например "старый" таймер Intel 8254 имели фиксированную архитектуру, их наличие и параметры конфигурации не могли быть опциональными. Поэтому, для DOS программ не стояла задача детектирования таких устройств, программы были "уверены" в их наличии и фиксированной конфигурации, и использовали их без каких-либо предварительных проверок.

Позднее, появился интерфейс System PnP, который позволял передавать информацию о конфигурации устройств от BIOS к ОС. "Старые" контроллеры DMA, прерываний и таймер входят в число устройств, параметры которых декларируются средствами этого интерфейса. Теоретически, это дало возможность сообщать ОС о наличии и отсутствии данных устройств и их конфигурации, которая может отличаться от стандартной. На практике, несмотря на это, на большинстве платформ, все перечисленные устройства сохранились в том виде, в каком они совместимы с DOS программами.

Рассматриваемый в данной статье таймер HPET был разработан значительно позже, во времена господства совсем другой идеологии. Наличие этого устройства, количество таких устройств на плате, адреса регистров, номера используемых линий запросов на прерывание и частота тактирования счетчиков являются опциональными параметрами, значения которых передаются от BIOS к ОС посредством интерфейса ACPI и регистров самого таймера. Операционная система перед использованием таймера HPET должна обнаружить и интерпретировать ACPI таблицу с сигнатурой "HPET". Согласно спецификации ACPI, это сводится к следующим действиям.

1) Выполняется сканирование блока BIOS Runtime (адреса 000E0000h-000FFFFFh), если ACPI поддерживается, там будет обнаружена структура RSDP (Root System Description Pointer). Структура RSDP содержит указатель на таблицу RSDT (Root System Description Table), содержащую каталог таблиц ACPI. RSDT и другие таблицы ACPI находятся в верхних адресах Extended памяти в блоке служебной информации BIOS. Для того, чтобы при использовании Extended памяти этот блок не был "затерт", размер памяти, о котором рапортует BIOS, уменьшен на размер этого блока.

2) Обнаружив таблицу RSDT, операционная система последовательно проверяет таблицы, адреса которых перечислены в RSDT и ищет таблицу с сигнатурой "HPET". Таких таблиц может быть несколько, если используется несколько таймеров.

3) Из таблицы HPET операционная система считывает адрес MMIO-региона, в котором находится блок регистров HPET.

4) Другие опциональные параметры (номера используемых линий запросов на прерывание и частота тактирования счетчиков) считываются из регистров, расположенных в регионе MMIO.

Разумеется, детектирование RSDP и RSDT, выполняется операционной системой не только для детектирования HPET, интерфейс ACPI сегодня является основным средством передачи информации о конфигурации платформы от BIOS к ОС.

Подробности в [18].

Эксперимент с программированием конфигурационных регистров

В предыдущем разделе рассмотрен "легальный" метод детектирования, работоспособный на платформах, BIOS которых поддерживает HPET и декларирует его посредством ACPI. Вместе с тем, как было сказано выше, существует много платформ, у которых данный компонент отсутствует, несмотря на то, что чипсет его поддерживает. Дело тут в функциональности BIOS и, разумеется, практический совет обладателям таких платформ, желающим появления HPET в своей системе – перепрошивка новой версии BIOS с сайта производителя платы, а также проверка разрешен ли HPET в BIOS Setup.

Вместе с тем, руководствуясь исследовательским интересом, автор выполнил принудительное включение HPET на одной из платформ, у которых этого не делает BIOS. Естественно, результаты этой операции сохраняются до первой перезагрузки. При ее выполнении используются конфигурационные регистры, реализованные по-разному в разных чипсетах. Процедура, добавленная в пример, работоспособна на платах, использующих "южный мост" Intel ICH6 (это платы на чипсетах Intel 915, 925), заинтересованный читатель может добавить поддержку других чипсетов.

Программа, находящаяся в прилагаемом каталоге WORK сначала пытается найти HPET "по-хорошему", используя ACPI, эта часть программы работоспособна независимо от модели чипсета. Только в том случае, если это не удается, управление будет передано на процедуру детектирования чипсета и запуска chipset-specific процедуры включения HPET.

Для включения HPET микросхемы Intel ICH6 необходимо выполнить следующие действия.

1) Локализовать в конфигурационном пространстве PCI блок регистров устройства ICH6 LPC Interface. Для этого требуется найти устройство с параметрами:

Код производителя, Vendor ID = 8086h (Intel)
Код устройства, Device ID = 2640h (ICH6, ICH6R LPC Interface) или 2642h (ICH6W, ICH6RW LPC Interface).

2) В указанном блоке прочитать 32-разрядный регистр с адресом 00F0h, это регистр RCBA (Root Complex Base Address). Используя значение базового адреса, выделенное из содержимого этого регистра, мы можем получить доступ к 32-разрядному регистру HPTC (High Precision Timer Configuration), который расположен в пространстве памяти по адресу RCBA+3404h. Бит 7 регистра HPTC разрешает доступ к блоку регистров HPET. Биты 1,0 выбирают один из четырех вариантов адреса. Остальные биты зарезервированы.

3) Записав в регистр HPTC значение 10000000b (D7=1, D[1,0]=00) мы обеспечим появление HPET в пространстве памяти по адресам FED00000h-FED003FFh.

Подробности в [8], [17].

Архитектура HPET

Платформа может иметь произвольное количество таймеров HPET (согласно спецификации до 8). Каждый таймер декларируется ACPI таблицей "HPET", использует регион MMIO размером 1KB и может содержать от 1 до 32 компараторов. Здесь требуется пояснение. Как известно, "старый" таймер Intel 8254, имеет 3 канала, каждый из которых является независимым счетчиком, который может запускаться, останавливаться, загружать новое значение по командам от процессора. Таймер HPET устроен иначе, он имеет один счетчик на все каналы. Каждый канал имеет собственный регистр данных и компаратор (схему сравнения кодов). Когда содержимое общего счетчика, одновременно поступающее на компараторы всех каналов, совпадет с содержимым регистра данных в каком-либо канале, компаратор этого канала выдаст сигнал совпадения и канал сгенерирует запрос на прерывание (если генерация запроса разрешена).

Счетчик работает в режиме инкрементирования. Разрядность счетчика (32 или 64 бита), а также период тактового сигнала счетчика могут быть различными от платформы к платформе. Их значения декларированы в регистре General Capabilities and ID Register.

Таким образом, чтобы запрограммировать генерацию запроса на прерывание через некоторый интервал времени T (представленный в секундах), программа должна пересчитать секунды в такты счетчика, используя информацию о периоде тактового сигнала N=T/K.

N = Количество тактов таймера в требуемом интервале
T = Длительность требуемого интервала в секундах
K = Длительность такта таймера в секундах.

Затем, в регистр данных используемого канала требуется записать число L=N+M.

L = Число для записи в регистр данных используемого канала
N = Ранее вычисленное количество тактов таймера в требуемом интервале
M = Текущее состояние общего счетчика

По прошествии N тактов, счетчик, находящийся в данный момент в состоянии M, досчитает до состояния L и будет сгенерировано прерывание.

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

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

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

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

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

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

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

17) PCI BIOS Specification. Revision 2.1.

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

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

Книги

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



Теги: ассемблер , программирование , процессоры





СЛЕДУЮЩИЕ СТАТЬИ
Ударь копирайтом по работодателю: возвращаем финансы, честно заработанные на служебных произведениях
Руткит в сетевухе: фантазии программиста о создании непобедимого руткита
Чемпионаты по программированию и не только
Алгоритмическая симфония из одной строчки кода
Kinect: разбираемся с новым девайсом и учимся писать для него приложения
Программное обеспечение: поглощая мир
SMS-похититель для Android: Sсriрting Layer for Android - интересная среда разработки для мобильного телефона
13 утилит для безопасной разработки: инструменты от Microsoft для написания надежного кода
Silverlight: защита и нападение
Кроссплатформенный кодинг для мобильных платформ: покоряем iOS, Android, Bada, Symbian и WM с помощью AirPlaySDK
ПРЕДЫДУЩИЕ СТАТЬИ
Устройства системной поддержки: исследовательская работа № 7
Приручение баз данных: собственный DataSet
Delphi 2009: Tiburon со слов очевидцев
SMM и SMRAM или 128 Кб потусторонней памяти: исследовательская работа №6
SMM и SMRAM или 128 Кб потусторонней памяти: исследовательская работа №5
Multi-Threading под DOS: исследовательская работа №4
Multi-Threading под DOS: исследовательская работа №3
Developer vs Cracker: косвенная адресация
64-битный режим под DOS: исследовательская работа №2
64-битный режим под DOS: исследовательская работа №1
ОБСУЖДЕНИЕ СТАТЬИ
Логин:
Пароль:
Если у вас есть форумный логин - вы можете использовать его, иначе анонимный гостевой доступ.

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

Обсуждение этой статьи на forum.xakep.ru
Для отправки сообщения введите код, указанный на картинке
Сообщение

UserГость
19.09.2008 17:03:48
Ответить Ссылка
копипастить не устали нубы
гавноксакепкапец++




Keywords: zPOSTz zSOFTz, zHOWz, zINFOz, zYANDEXz z45205z
Для Авторов: edit Lock delete Lock



    Rambler's Top100