RSDP/ru
RSDP (Root System Description Pointer) - одна из основных структур данных (таблиц), используемых в программном интерфейсе ACPI.
Спецификация ACPI 1.0 определяет следующий вид структуры RSDP:
<source lang="c"> struct RSDPDescriptor {
char Signature[8]; BYTE Checksum; char OEMID[6]; BYTE Revision; DWORD RsdtAddress;
} </source>
начиная с версии 2.0 она была изменена, были добавлены новые поля данных:
<source lang="c"> struct RSDPDescriptor20 {
char Signature[8]; BYTE Checksum; char OEMID[6]; BYTE Revision; DWORD RsdtAddress;
DWORD Length; QWORD XsdtAddress; BYTE ExtendedChecksum; BYTE reserved[3];
}; </source>
Обнаружение 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)