Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

вызов функций PNPBIOS API из 32 и 64 битных режимов

27K
10 ноября 2007 года
korisk
12 / / 11.08.2007
Здравствуйте!
Возникла необходимость получить доступ к функциям управления системных 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, если да, то как?

Спасибо
551
10 ноября 2007 года
Pavia
357 / / 22.04.2004
Такое впячатление что вам попали в руки мои старые черновики. PnP не нужен есть и другой способ доступа.
Все программы которые я знаю читают из памяти таблици разбирают их.

Для доступа к таблицам DMI существует и другой способ.
Если просканировать адрес с 0F0000h-0FFFFFh через 16 Байт в поисках сигнатуры SMBIOS
”_SM_” 05F4D535Fh. Можно сразу также искать сигнатуру ”_DMI_” 5F 44 4D 49 5F.

Код:
+---------------------+--------+------+-----------+
|Назначение поля      |Смещение|размер|  Значение |
+---------------------+--------+------+-----------+
|Сигнатура 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     |
+---------------------+--------+------+-----------+

Дальше разбираешь таблицы DMI
Каждая структура имеет три обязательных поля.
 
Код:
+-----------+--------+
|  Поле     | размер |
+-----------+--------+
|  Тип      | Byte   |
+-----------+--------+
|  Длина    | Byte   |
+-----------+--------+
|  Индекс   | Word   |
+-----------+--------+

По длине переходим между структурами. Последняя структура имеет тип 127. Читайте подробнее документацию ссылку вы и сами знаете.

Ответ, на твои вопросы. Создаем VM86 и используем функции PnP.
27K
12 ноября 2007 года
korisk
12 / / 11.08.2007
>Такое впечатление что вам попали в руки мои старые черновики.
Я смотрел код 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)

Спасибо
551
12 ноября 2007 года
Pavia
357 / / 22.04.2004
Зато есть режиме совместимости.
Тогда можно 16битный сегмент сделать.

Цитата:
Но тут возникают смутные сомнения - а как возвратиться, если точка возврата за пределами 64кб.

Дальний переход. Вызов прерывания для перехода, также ret, а также спец команды.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог