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

Ваш аккаунт

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

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

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

Получение информации о железе

1.8K
17 октября 2007 года
Kama
153 / / 04.05.2006
всем прива...
есть такое задание , нужно сделать загрузчик который бы считывал бы железо компа., как я понимаю инфа железа должна быть собрана на мат.плате а от туда ее и считывают? и если так то как обрашаться к плате? заранее thanx
261
17 октября 2007 года
ahilles
1.5K / / 03.11.2005
например некоторую инфу о железе можно получить из BIOS (через SMBIOS, или DMI или как там это называют), там есть определённая область памяти, в которой хранится некторая ифна о железе.
вот ссылочка на документ где написано про формат хранения данных в DMI
http://www.dmtf.org/standards/published_documents/DSP0134.pdf
551
17 октября 2007 года
Pavia
357 / / 22.04.2004
Для загрузчика это мало нужно.
Насчет информации об устройствах.

DMI он же SMBIOS, содержит много бесполезной информации.

PnP точка входа расположена в биосе, содержит информацию о усоревших устройствах PIC, COM ,PIT SoundBlaster, контроллер клавиотуры. Если тебе нужно определить присутствие этих устройств и их ресурсы то стоит воспользоваться PnP. Хотя они стондартные и их параметра зачастую совподают и можно принять за то что они есть.

Помимо этого есть стандарт на PnP для определения COM и LPT устройств.

Конфигурационно простанство PCI. Каждое устройство PCI оснощенно блоком в 256 Байт (E-PCI большем) в котором находяться различная информация, Обычно базовые порты и адресс памяти. Их диапозоны, IRQ.

Жесткии диски нужно искать самому. И SMART тоже читать самому.

Есть еще USB там свои заморочки уж больно большой протокол общения.

Также в комьюторе есть различные устройства такие как датчики напряжения скорости вращения вентиляторов температуры. Тут надо качать доки на SuperI/O все зависит от материнке на разных по разному.

Также есть возможность прочитать информацию от монитора и модулей памяти. Информацию о мониторе лучше получить через прирывание биоса видео карты Int 10h смотри спецификации VESA.

Что касается модулей памяти то тут все заворачивается в программирование SMBus на каждой материнке программируется по своему.

Помимо прочего через SMBus можно достучаться до баторей ноутбука.


Для получения обыема доступной памяти предпочтительнее использовать прерывание Int 15h.


Мои черновики.

http://footballtabl.h15.ru/ivan/shelezo.rar

PS. Критику принимаю.
1.8K
19 октября 2007 года
Kama
153 / / 04.05.2006
вы просто класс...спасибо большое
просмотрел одним глазом , вроде ничего... надо теперь за ассемблер браться ;)
но теперь возникает другой вопрос , где можно найти инфу о архитектуре компа...

PnP
как я понял это Plug and Play ..

а что такое DMI, SMBIOS ?

a что если "дисассемблирить" известные программы как Everest , AIDA, PCMark..

можно оттуда что-нибудь вывести?
551
19 октября 2007 года
Pavia
357 / / 22.04.2004
Как где ? В гугле !
PnP - это Plug and Play.
DMI это сокрощение в данном случае Desktop Management Interface.
Ссылка во втором посте смотри.

[qoute]a что если "дисассемблирить" известные программы как Everest , AIDA, PCMark..

можно оттуда что-нибудь вывести?[/qoute]
Я тебе не запрещаю. Чего нибудь да найдешь.

Вот мои исходники на паскале
http://forum.sources.ru/index.php?act=Attach&type=post&id=1602783
1.8K
22 октября 2007 года
Kama
153 / / 04.05.2006
спасибо за совет но ишодники твои только для авторизированных. Везде регистрироваться не охото ;)
Есть ли другие ссылки?
thanx
551
22 октября 2007 года
Pavia
357 / / 22.04.2004
Отсюда можно скачать самую последнюю версию:
http://footballtabl.h15.ru/ivan/info_0.71.zip
Правда недоделок много, так как билд не круглый.
1.8K
23 октября 2007 года
Kama
153 / / 04.05.2006
огромное thanx ;) очень рад, спасибо за помощь, не забуду никогда.
Так как компа нет не могу проверить работает ли твоя программка под виндовс или нет, .. да вообше наверное не важно , главное принцип написания пойму сам напишу. Еще раз огромный thanx.
если вопросы будут мастер этого дела ты , я к тебе и обращюсь
1.8K
12 февраля 2008 года
Kama
153 / / 04.05.2006
Сейчас читаю документацию (DSP0134 / info_0.71.zip) но появились некоторые вопросы,
1) чем отличается BIOS от SMBIOS
2) а зачем нужен DMI?
551
12 февраля 2008 года
Pavia
357 / / 22.04.2004
BIOS - Basic Input/Output System, базовая система ввода вывода.
SMBus- System Management Bus, управляющая шина. Служит для управления различными системными устройствами. По сути это шина I2C, только стандартерезированная для своих нужд фирмой Intel.

SMBIOS - System Management BIOS, часть BIOS'a служит для стандартерезации информации о компьюторе и его комплектующих. Тотже самый DMI, просто назвали подругому.

DMI- Desktop Management Interface, основная цель создание и упровление MIF базой. DMI это новой способ управления компьютером и его переферией. На самом деле просто различная информация о компьюторе, собственно для этого и служит.

MIF-Management Information Format Database
База данных о устройствах компьютера.
1.8K
14 февраля 2008 года
Kama
153 / / 04.05.2006
а DMI, как я понял имеет всего одну маленькую структуру ???
551
14 февраля 2008 года
Pavia
357 / / 22.04.2004
DMI/SMBios это фактически одна таблица.
Вернее так, есть струтура которая ссылается на главную таблицу.
А главная таблица это набор записей. Где каждая запись содержит различную информацию. Таблица не такая уж и маленькая. Типов структур много порядка 40 штук. Они не обязанны присутсвовать все, но их надо разбирать. У меня в коде описанно 20 типов структур.

Для доступа к главной таблице также есть PnP функции. Мне говорили что они у когото не работали, а в коде предусмотренн доступ к этой таблице только через PnP. Можно добавить и разбор таблицы лежащей в памяти.
1.8K
15 февраля 2008 года
Kama
153 / / 04.05.2006
ну ну, это наверное как раз тот код...по которому я занимаюсь, тогда дело в том зачем нужны PnP функции, я например смысла никакого не нахожу, да и если представить что PnP не поддерживаются старыми компами (это у тех у кого не работает,кто ответ уже написал) выходит облом, а без этих функций никак?

2) В коде уж очень много PUSH команд, зачем?, я тоже не понял?
551
15 февраля 2008 года
Pavia
357 / / 22.04.2004
PnP появилось раньше DMI.
Можно и без PnP.

Для доступа к DMI есть два способа.
1. Через точку входа PnP.
2. Искать точку входа в памяти и вручную разбирать таблицы.

Я просто сначало узнал о первом способе потом нашел и второй .

Описания большинства структур можно найти в файле BIOS_DMI_20.pdf
Наиболее свежее и полное описание в файле DSP0134_old.pdf

Если просканировать адрес с 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     |
+---------------------+--------+------+-----------+





Дальше зная начало таблиц нужно их разобрать. Каждая запись в таблице имеет три обязательных поля.

 
Код:
+-----------+--------+
|  Поле     | размер |
+-----------+--------+
|  Тип      | Byte   |
+-----------+--------+
|  Длина    | Byte   |
+-----------+--------+
|  Индекс   | Word   |
+-----------+--------+



Последняя запись имеет тип 127.

Цитата:
2) В коде уж очень много PUSH команд, зачем?, я тоже не понял?



Много, PUSH потомучто PnP использует "С" способ вызова процедур.

Для доступа к DMI можно использовать PnP. При использовании интерфейс PnP это функции 50h-5Fh . DMI служит дальнейшем развитием системы сбора информации о компьютере. Этот интерфейс без особого труда позволяет получить различные параметры железа. Как и в случаи с PNP. Мы воспользуемся только двумя функциями. 50h получим число структур и максимальный размер, а через 51h считаем нужную структуру.

Код:
push es         ;
push ds               ; Указатель на DMIStorageSize
push word dmiStorageSize
push ds               ; Указатель на DMIStorageBase
push word dmiStorageBase
push ds               ; Указатель на StructureSize
push word StructureSize
push ds               ; Указатель на NumStructures
push word NumStructures
push ds               ; Указатель на DMIBIOSRevision
push word dmiBIOSRevision
push word GET_DMI_INFORMATION ; Function number, 50h
call FAR [es:si+0Dh]
add sp, 24    ; Очищаем стек
cmp ax, 0     ; Проверяем удачно ли завершилась функция
je @Not_Error ; Нет ошибок
cmp ax,82h    ; Ошибка 82
je NOT_DMI
@Not_Error:

Ошибка 82 – функция не поддерживается, это означает, что DMI не поддерживается.
dmiBIOSRevision db 0 - версия DMI в формате BCD.
NumStructures dw 0 - число структур
StructureSize dw 0 – Размер максимальной структуры
dmiStorageBase dd 0 – 32 байтный физический адрес
dmiStorageSize dw 0 – размер всего DMI.
Если DMI отображен в память, то в dmiStorageBase находиться базовый адрес всего DMI, а в dmiStorageSize его размер.
Если dmiStorageBase равен 0, то DMI не отображен в память.

Затем в цикле будем вызывать следующую функцию.
Код:
push es         ; BiosSelector Сегмент BIOSa или его дескриптор
mov  ax,0h
push ax         ; dmiSelector
push ds         ; Указатель на dmiStrucBuffer
push word dmiStrucBuffer
push ds             ; Указатель на Structure
push word Structure
push GET_DMI_STRUCTURE ; Function number, 51h
call FAR [es:si+0Dh]
add sp, 14 ; Очищаем стек
cmp ax, 0  ; Проверяем удачно ли завершилась функция
jne error

Она в буфер dmiStrucBuffer, структуру с заданным индексом.
Structure - индекс структуры автоматически после каждого вызова увеличивается.

Все дальше остается разобрать структуру.
1.8K
19 февраля 2008 года
Kama
153 / / 04.05.2006
насколько я понял (DSP0134.pdf) определение DMI через PnP выходит из моды.. Да и мне этот метод не очень понравился. Ну а допустим я вручную просканирую адресное пространство на наличие ДМИ а как потом определить где и какая структура находится (последовательно как в содержании???), сразу скажу что документ на английском я читаю но не очень то понимаю. А структуры как я понял, начинаются с границ 16 байтов.А как определять длину той или иной структуры?
Спасибо за труд Pavia, но у меня этот код и структуры на бумаге есть,..
Кстати на notebook`e програмка info007 через DMI не работает... error 131 какой-то.
551
19 февраля 2008 года
Pavia
357 / / 22.04.2004
Линейный адрес начала таблиц DMI содержиться по смещению 18h. По этому адрессу лежат записи последовательно. Каждая запись имеетр поле которая определяет размер. Вот следающая за ней запись будет лежать по адрессу=данная запись+длина. Второе байт длина, я же выше написал.

error 131 ??? Вобщем это ошибка паскаля. Скорее всего не смог прочитать файл базы данных. А почему не знаю.
1.8K
25 февраля 2008 года
Kama
153 / / 04.05.2006
начал писать свою программу но столкнулся с одной неприятностью, никак программа моя не может найти ДМИ структуру, кусочек кода приведен ниже, в чем дело подскажите кто знает..

Код:
mov cx,00FFFh
q1:
    lodsw
    cmp ax,[word ptr es:di]
    je q2
    loop q1

    jmp NOT_FOUND
q2:
    lodsw
    cmp ax,[word ptr es:di+2]
    je FOUND
    jmp q1

FOUND:
    push es
    pop ds
    mov di,offset SMBIOS_Y
    call strwrite
    call NewLine
    jmp exit

NOT_FOUND:
    push es
    pop ds
    mov di,offset SMBIOS_N
    call strwrite
    call NewLine
    jmp exit
551
26 февраля 2008 года
Pavia
357 / / 22.04.2004
Не все адресса перебираешь циклов всего 0FFFh, а по 2 байта читаешь и следовательно счетчик адресссов пробигает только от 0 до 1FFE
1.8K
27 февраля 2008 года
Kama
153 / / 04.05.2006
Цитата: Pavia
Не все адресса перебираешь циклов всего 0FFFh, а по 2 байта читаешь и следовательно счетчик адресссов пробигает только от 0 до 1FFE



извиняюсь конечно ( и за мою глупость), но я что-то не понял..2 дня мучиюсь, вы не говорите, вродь иди читай ассемблер, так как я его знаю уже на нормальном уровне... Сегменты и Смещения для меня было что-то но в конце концов я понял... сейчас же у меня все кувирком опять,.. зачем мне писать 0FFFFh (0FFFFh-0F000h=00FFFh), а как вы считали? Потом посчитав по-другому(0F000h:0000h-0FFFFh:FFFFh) у меня вишел совсем другой результат (0FFFFFFFh).
считая еще по другому, а именно

0F000h
+
00268h
------
0F2680h (ноль в конце прибавляется, не так ли?)

получалось всегда как я считал нормально, нет опять не то ведь допустим,

0FFFFh (segment)
+
0ABCDh (offset)
------
0??????h
тогда переполнение.
извините еще коныечно если вопросы глупые и не коректные но надо сделать одно задание и самое главное освоить эти тонкости.

1.9K
27 февраля 2008 года
andriano
474 / / 10.01.2008
Сегментированная адресация в реальном режиме позволяет получить доступ к полному 20-разрядному адресу.
В реальном режиме складывается смещение и сегмент, сдвинутый на 4 разряда (умноженный на 16), получается 20-разрядный адрес. На самом деле так можно адресовать на 1 Мб, а примерно на 64 Кб больше. Этот "избыток" появился в 286 процессоре и называется Hi Memory. Но это уже тонкости, главное полный адрес = сегмент*16 + смещение.
551
27 февраля 2008 года
Pavia
357 / / 22.04.2004
Kama, Внимательно посчитай сколько цифр написанно в #14 посте.

Есть понятие линейного адресса. Сегмен и смещение неудобно.
линейный адресс=база+смещение
Для реального режима
линейный адресс=сегмент*16+смещение
0F0000h-0FFFFFh тут линейный адресс
F000:0000-F000:FFFF
так как F000:FFFF=FFFF:000F
100000h=1МБайт то все нормально
А вот что дальше
FFFF:FFFF=10FFEFh одно из двух либы адрес зацикляться и начнуться с первого мегабайта либы пойдут на второй мегабайт. IBM Решила дать возможность упровлять этим включением линии A20. Тебе это не нужно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог