В SiSoftSandra есть возможность просмотреть не только размер оперативной памяти но и узнать в каких слотах какая планка стоит. Тоесть отдельно по каждому разьёму она каким-то образом выдает информацию о размере планки, частоте, производителе, возможностях енергозбережения и т.д. Каким образом можно это сделать в безопастном режиме? Помогите пожалуйста кто знает!
Специально перегрузился, чтобы посмотреть. В безопасном режиме cpuz не выводит инфо по планкам памяти. Как и SiSoftware Sandra.
rudik Делается это через SMBus. Читаешь SPD с планок. Адреса SPD будут 50h 51h 52h 53h. Для начало нужно найти SMBus. Вернее его адрес базового порта. В 80% адрес SMBus ищется так. Сканируем все устройства PCI ищем класс 0C0500 устройства SMBus. Дальше перебираем 6 BAR регистров, так как некоторые из них могут быть нулевыми. На старых машинах адрес SMBus ищется по другому. Дальше программируешь SMBus. Я пользовался следующим кодом, но это не верх совершенства может работать долга. Код (Text): Function ReadSMBus(SMBusAddr, Addr:Word):Byte; var a:Byte; begin asm mov dx,SMBUsAddr mov cx,Addr @loc_E92F7: in al,dx {+0 Читаем регистр статуса} out 0EBh,al {Задержка} out dx,al {+0 Пишем в регистр статуса, что обнуляет его} and al,0BFh or al,al jnz @loc_E92F7 {Ждем пока контролер не освободиться???} add dx,4 {+4 Регистр адреса нулевой бит определяет запись или чтение 1=Read 0=Write} mov al,ch or al,1 out dx,al mov al,cl dec dx {+3 Регистр команды, для EEPROM это адрес ячейки} out dx,al dec dx {+2 Регистр Host Controler регистр задает способ передачи} mov al,48h {Способ передачи с Byte Data 010b } out dx,al out 0EBh,al {Задержка} xor cx,cx sub dx,2 {+0 регистр статуса} @loc_E931C: {Порядок проверок важен!!!} in al,dx out 0EBh,al {Задержка} test al,4 {ошибочки устройства} jnz @loc_E932D test al,2 {Произошло прерывание} jz @loc_E932B test al,80 {данные пришли} jnz @loc_E932D @loc_E932B: loop @loc_E931C @loc_E932D: out dx,al {+0 Пишем в регистр статуса, что обнуляет его} add dx,5 {+5 Регистр данных Date0} in al,dx mov a,al end; ReadSMBus:=a; end; addr - нижней байт адрес ячейки/регистра устройства. верхний байт адрес устройства, но сдвинутый на 1 бит в лево. После того как считаешь SPD нужно разобрать, что считал. У Intel на сайте найдешь описание spdsd12a.pdf
rudik идешь на сайт Intel скачиваешь документацию по 865PE (MCH) и ICH5 по документации на ICH5 изучаешь работу с SMBus контроллером, а в документации на MCH смотришь раздел 5.2.5
10110111 DMI вещь хорошая выводит много интерестного. Но не все точно выводит. Информацию о планках памяти там неполная.
NoName Ты можешь просто и не знать о его существовании. На старых компах SMBus ищется иначе. Код (Text): const VDID_PIIX4=$71138086; VDID_AMD756PM=$740B1022; VDID_AMD766PM=$74131022; VDID_AMD768PM=$74431022; VDID_AMD8111PM=$746B1022; for i:=0 to PCICount do begin PCI:=PCIListNum(i); ReadPCICFGReg(PCI^.Addr+$00,Reg1); if (Reg1=VDID_PIIX4) then begin ReadPCICFGReg(PCI^.Addr+$90,Reg1); Addr:=Reg1 and $FFF0; break; end; if (Reg1=VDID_AMD756PM)or(Reg1=VDID_AMD766PM)or(Reg1=VDID_AMD768PM)or(Reg1=VDID_AMD8111PM) then begin ReadPCICFGReg(PCI^.Addr+$58,Reg1); Addr:=Reg1 and $FFF0; break; end; У меня дома пентиум второй материнская плата там PIIX4. Компу уже 9 лет. Так вот одна планка на 16 друга на 128. Та что на 16 не читается просто отсутствует SPD блок.
где можно найти все адреса устройств на шине smbus я знаю только 50h-57h spd памяти А где найти остальные?