+---------------------+--------+------+-----------+
|Назначение поля |Смещение|размер| Значение |
+---------------------+--------+------+-----------+
|Сигнатура SMBUS | 00h |4Байта|"_SM_"ASCII|
+---------------------+--------+------+-----------+
|Контрольная сумма | 04h | Байт | CheckSum |
+---------------------+--------+------+-----------+
|Длина структуры | 05h | Байт | 1Fh |
+---------------------+--------+------+-----------+
|Версия старшая часть | 06h | Байта| различное |
+---------------------+--------+------+-----------+
|Версия младшая часть | 07h | Байт | различное |
+---------------------+--------+------+-----------+
|Максимальный размер | | | |
|структуры для PNP | 08h |2Байта| различное |
+---------------------+--------+------+-----------+
|Подверсия | 0Ah | Байта| 00 |
+---------------------+--------+------+-----------+
|Зарезервировано | | |Зависит от |
| | 0Bh |5Байта|подверсии |
+---------------------+--------+------+-----------+
+---------------------+--------+------+-----------+
|Сигнатура | | | "_DMI_" |
| | 10h |5Байта| ASCII |
+---------------------+--------+------+-----------+
|Контрольная сумма | | | |
|для блока DMI | 15h | Байта| CheckSum |
+---------------------+--------+------+-----------+
|Длина таблиц DMI в | | | |
| Байтах | 16h |2Байта| различное |
+---------------------+--------+------+-----------+
|Линейный адрес начала| | | |
|таблиц DMI | 18h |4Байта| различное |
+---------------------+--------+------+-----------+
|Число таблиц DMI | | | |
| | 1Ch |2Байта| различное |
+---------------------+--------+------+-----------+
|Версия DMI BCD | | | различное |
| | 1Eh | Байта| BCD |
+---------------------+--------+------+-----------+
вызов функций PNPBIOS API из 32 и 64 битных режимов
Возникла необходимость получить доступ к функциям управления системных DMI логов. Они доступны через интерфейс PNPBIOS API (http://www.dmtf.org/standards/smbios/). Таблица с точкой входа находится по сигнатуре $PnP. Функции доступны из 16bit protected mode.
Как мне кажется, нужно создать пару 16-битных дескрипторов в GDT, сделать туда длинный переход и тогда уже вызывать функции БИОСа. Но тут возникают смутные сомнения - а как возвратиться, если точка возврата за пределами 64кб.
Для i386 это точно возможно(есть работающий драйвер в ядре линукса).
Для x86-64 возможность под вопросом, хотя это как раз, то что мне нужно.
Вопросы:
1. Как реализуется механизм вызова PNPBIOS API в 32 битном режиме?
2. Возможно ли это в x86-64, если да, то как?
Спасибо
Все программы которые я знаю читают из памяти таблици разбирают их.
Для доступа к таблицам DMI существует и другой способ.
Если просканировать адрес с 0F0000h-0FFFFFh через 16 Байт в поисках сигнатуры SMBIOS
”_SM_” 05F4D535Fh. Можно сразу также искать сигнатуру ”_DMI_” 5F 44 4D 49 5F.
Код:
Дальше разбираешь таблицы DMI
Каждая структура имеет три обязательных поля.
Код:
+-----------+--------+
| Поле | размер |
+-----------+--------+
| Тип | Byte |
+-----------+--------+
| Длина | Byte |
+-----------+--------+
| Индекс | Word |
+-----------+--------+
| Поле | размер |
+-----------+--------+
| Тип | Byte |
+-----------+--------+
| Длина | Byte |
+-----------+--------+
| Индекс | Word |
+-----------+--------+
По длине переходим между структурами. Последняя структура имеет тип 127. Читайте подробнее документацию ссылку вы и сами знаете.
Ответ, на твои вопросы. Создаем VM86 и используем функции PnP.
Я смотрел код dmidecode и linux-2.6.20 %)
>PnP не нужен есть и другой способ доступа.
>Все программы которые я знаю читают из памяти таблици разбирают их.
К сожалению, я тоже других не знаю.
Разобрать таблицу - пол дела.
В подтаблице 15 (System Event Log) предоставляется информация о возможных типах сообщений, методе доступа к ним , о параметрах метода и несколько дополительных полей. Тела сообщение могут быть доступны через 5 различных интерфейсов - несколько типов портов, адрес в памяти и GPNV(PNPBIOS API функции 0x50 - 0x57). Кроме того, хотелось бы очищать заполненный буфер - опять нужны функции.
В моей машине предоставляется последний интерфейс.
>Ответ, на твои вопросы. Создаем VM86 и используем функции PnP.
В x86_86 long mode нет VM86, придется ковырять как это организовать.
А можно посмотреть те старые черновики?
если там есть примеры с GDT и тп
(korisk@yandex.ru)
Спасибо
Тогда можно 16битный сегмент сделать.
Цитата:
Но тут возникают смутные сомнения - а как возвратиться, если точка возврата за пределами 64кб.
Дальний переход. Вызов прерывания для перехода, также ret, а также спец команды.