RSDP/ru

From KolibriOS wiki
Jump to: navigation, 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 (первая структура) вы суммируете все байты структуры с полем Checksum, после чего должны убедиться в том, что младший байт результата равен нулю. Для ACPI 2.0 и более поздних версий необходимо сделать практически то же самое для части полей структуры определённой в версии 1.0 и последующих версиях, а затем повторить операцию для полей расширенной структуры, определённых в версии 2.0 (вторая структура).

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

Постоянные поля (определённые в ACPI 1.0)

Signature

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

Checksum

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

OEMID

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

Revision

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

Rsdt Address

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


Поля определённые в ACPI 2.0

Length

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

Xsdt Address

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

Extended Checksum

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

Reserved

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

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

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