RSDP/ru

From KolibriOS wiki
Revision as of 17:36, 23 June 2010 by Asper (talk | contribs) (New page)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

RSDP (Root System Description Pointer) - одна из основных структур данных (таблиц), используемых в программном интерфейсе ACPI.

Спецификация ACPI 1.0 определяет следующий вид структуры RSDP:

struct RSDPDescriptor {
 char Signature[8];
 BYTE Checksum;
 char OEMID[6];
 BYTE Revision;
 DWORD RsdtAddress;
}

начиная с версии 2.0 она была изменена, были добавлены новые поля данных:

struct RSDPDescriptor20 {
 char Signature[8];
 BYTE Checksum;
 char OEMID[6];
 BYTE Revision;
 DWORD RsdtAddress;

 DWORD Length;
 QWORD XsdtAddress;
 BYTE ExtendedChecksum;
 BYTE reserved[3];
};

Обнаружение RSDP

RSDP может находиться либо в первом килобайте EBDA (Extended BIOS Data Area) (указатель на EBDA, размером в два байта, в реальном режиме находиться по адресу 0x040E), либо в регионе памяти от 0x000E0000 до 0x000FFFFF (основной регион памяти BIOS ниже 1 MB). Чтобы найти таблицу, операционная система должна найти строку "RSD PTR " (размером в 8 байт) в одном из указанных регионов памяти. Эта сигнатура всегда выровнена по границе в 16 байт.

Проверка RSDP

После того как вы нашли таблицу RSDP, необходимо узнать версию ACPI используюмую BIOS, и проверить контрольную сумму.

Определение версии ACPI

Версия ACPI может быть определена, с использованием поля Revision в RSDP. Если это поле содержит 0, то используется 1.0 версия ACPI, если 1 - то 2.0, если 2 - то 3.0, и т.д. ...

Проверка контрольной суммы

Перед тем как использовать RSDP необходимо проверить на правильность контрольную сумму. Для ACPI 1.0 (первая структура) вы добавляете каждый байт к структуре и должны убедиться в том, что младший байт результата равен нулю. Для ACPI 2.0 и более поздних версий необходимо сделать практически то же самое для части структуры определённой в версии 1.0 и после этого, а затем повторить операцию для расширения структуры, определённой в версии 2.0 (вторая структура).

Описание полей

Всегда писутствуют

Signature

Эта 8-байтная строка (не ASCIIZ!) должна содержать "RSD PTR ". Она выровнена на границу в 16 байт.

Checksum

Значение, которое добавляется ко всем остальным байтам таблицы (версии 1.0) для подсчёта контрольной суммы таблицы. Если последний байт полученной суммы не равен 0, таблица должна быть проигнорирована.

OEMID

В спецификации говорится: "OEM строка, которая идентифицирует OEM"

Revision

Номер ревизии ACPI. Большие номера ревизий обратно совместимы с меньшими. Для более подробной информации смотрите Detecting ACPI Version.

Rsdt Address

32-битный физический адрес таблицы RSDT.


Начиная с версии 2.0

Length

Длина всей таблицы.

Xsdt Address

64-битный физический адрес таблицы XSDT. Если вы определите, что версия ACPI равна 2.0, вы должны использовать эту таблицу вместо RSDT даже на x86, используя два двойных слова под адрес.

Extended Checksum

Это поле используется для подсчёта контрольной суммы всей таблицы, включая оба поля контрольной суммы (Checksum и Extended Checksum).

Reserved

Эти 3 байта должны игнорироваться при чтении и не должны перезаписываться.

Следующий шаг

На следующем шаге вам необходимо будет разпарсить RSDT (или XSDT)