Получение информации о железе
есть такое задание , нужно сделать загрузчик который бы считывал бы железо компа., как я понимаю инфа железа должна быть собрана на мат.плате а от туда ее и считывают? и если так то как обрашаться к плате? заранее thanx
вот ссылочка на документ где написано про формат хранения данных в DMI
http://www.dmtf.org/standards/published_documents/DSP0134.pdf
Насчет информации об устройствах.
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. Критику принимаю.
просмотрел одним глазом , вроде ничего... надо теперь за ассемблер браться ;)
но теперь возникает другой вопрос , где можно найти инфу о архитектуре компа...
PnP
как я понял это Plug and Play ..
а что такое DMI, SMBIOS ?
a что если "дисассемблирить" известные программы как Everest , AIDA, PCMark..
можно оттуда что-нибудь вывести?
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
Есть ли другие ссылки?
thanx
Так как компа нет не могу проверить работает ли твоя программка под виндовс или нет, .. да вообше наверное не важно , главное принцип написания пойму сам напишу. Еще раз огромный thanx.
если вопросы будут мастер этого дела ты , я к тебе и обращюсь
1) чем отличается BIOS от SMBIOS
2) а зачем нужен DMI?
SMBus- System Management Bus, управляющая шина. Служит для управления различными системными устройствами. По сути это шина I2C, только стандартерезированная для своих нужд фирмой Intel.
SMBIOS - System Management BIOS, часть BIOS'a служит для стандартерезации информации о компьюторе и его комплектующих. Тотже самый DMI, просто назвали подругому.
DMI- Desktop Management Interface, основная цель создание и упровление MIF базой. DMI это новой способ управления компьютером и его переферией. На самом деле просто различная информация о компьюторе, собственно для этого и служит.
MIF-Management Information Format Database
База данных о устройствах компьютера.
Вернее так, есть струтура которая ссылается на главную таблицу.
А главная таблица это набор записей. Где каждая запись содержит различную информацию. Таблица не такая уж и маленькая. Типов структур много порядка 40 штук. Они не обязанны присутсвовать все, но их надо разбирать. У меня в коде описанно 20 типов структур.
Для доступа к главной таблице также есть PnP функции. Мне говорили что они у когото не работали, а в коде предусмотренн доступ к этой таблице только через PnP. Можно добавить и разбор таблицы лежащей в памяти.
2) В коде уж очень много PUSH команд, зачем?, я тоже не понял?
Можно и без 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.
Много, PUSH потомучто PnP использует "С" способ вызова процедур.
Для доступа к DMI можно использовать PnP. При использовании интерфейс PnP это функции 50h-5Fh . DMI служит дальнейшем развитием системы сбора информации о компьютере. Этот интерфейс без особого труда позволяет получить различные параметры железа. Как и в случаи с PNP. Мы воспользуемся только двумя функциями. 50h получим число структур и максимальный размер, а через 51h считаем нужную структуру.
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 не отображен в память.
Затем в цикле будем вызывать следующую функцию.
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 - индекс структуры автоматически после каждого вызова увеличивается.
Все дальше остается разобрать структуру.
Спасибо за труд Pavia, но у меня этот код и структуры на бумаге есть,..
Кстати на notebook`e програмка info007 через DMI не работает... error 131 какой-то.
error 131 ??? Вобщем это ошибка паскаля. Скорее всего не смог прочитать файл базы данных. А почему не знаю.
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
извиняюсь конечно ( и за мою глупость), но я что-то не понял..2 дня мучиюсь, вы не говорите, вродь иди читай ассемблер, так как я его знаю уже на нормальном уровне... Сегменты и Смещения для меня было что-то но в конце концов я понял... сейчас же у меня все кувирком опять,.. зачем мне писать 0FFFFh (0FFFFh-0F000h=00FFFh), а как вы считали? Потом посчитав по-другому(0F000h:0000h-0FFFFh:FFFFh) у меня вишел совсем другой результат (0FFFFFFFh).
считая еще по другому, а именно
0F000h
+
00268h
------
0F2680h (ноль в конце прибавляется, не так ли?)
получалось всегда как я считал нормально, нет опять не то ведь допустим,
0FFFFh (segment)
+
0ABCDh (offset)
------
0??????h
тогда переполнение.
извините еще коныечно если вопросы глупые и не коректные но надо сделать одно задание и самое главное освоить эти тонкости.
В реальном режиме складывается смещение и сегмент, сдвинутый на 4 разряда (умноженный на 16), получается 20-разрядный адрес. На самом деле так можно адресовать на 1 Мб, а примерно на 64 Кб больше. Этот "избыток" появился в 286 процессоре и называется Hi Memory. Но это уже тонкости, главное полный адрес = сегмент*16 + смещение.
Есть понятие линейного адресса. Сегмен и смещение неудобно.
линейный адресс=база+смещение
Для реального режима
линейный адресс=сегмент*16+смещение
0F0000h-0FFFFFh тут линейный адресс
F000:0000-F000:FFFF
так как F000:FFFF=FFFF:000F
100000h=1МБайт то все нормально
А вот что дальше
FFFF:FFFF=10FFEFh одно из двух либы адрес зацикляться и начнуться с первого мегабайта либы пойдут на второй мегабайт. IBM Решила дать возможность упровлять этим включением линии A20. Тебе это не нужно.