Определение планок ОЗУ.

Тема в разделе "WASM.OS.DEVEL", создана пользователем rudik, 29 июн 2007.

  1. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    В SiSoftSandra есть возможность просмотреть не только размер оперативной памяти но и узнать в каких слотах какая планка стоит. Тоесть отдельно по каждому разьёму она каким-то образом выдает информацию о размере планки, частоте, производителе, возможностях енергозбережения и т.д.

    Каким образом можно это сделать в безопастном режиме? Помогите пожалуйста кто знает!
     
  2. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    например у меня (чипсет Intel 865PE) все можно узнать через SMBus
     
  3. rudik

    rudik Руденко Артём

    Публикаций:
    0
    Регистрация:
    6 дек 2006
    Сообщения:
    302
    Адрес:
    г. Харьков
    А можна поподробнее и ссылочку можеш дать?
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Специально перегрузился, чтобы посмотреть. В безопасном режиме cpuz не выводит инфо по планкам памяти. Как и SiSoftware Sandra.
     
  5. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    rudik
    Делается это через SMBus. Читаешь SPD с планок. Адреса SPD будут 50h 51h 52h 53h.
    Для начало нужно найти SMBus. Вернее его адрес базового порта.

    В 80% адрес SMBus ищется так. Сканируем все устройства PCI ищем класс 0C0500 устройства SMBus.
    Дальше перебираем 6 BAR регистров, так как некоторые из них могут быть нулевыми.
    На старых машинах адрес SMBus ищется по другому.

    Дальше программируешь SMBus.
    Я пользовался следующим кодом, но это не верх совершенства может работать долга.
    Код (Text):
    1. Function ReadSMBus(SMBusAddr, Addr:Word):Byte;
    2. var a:Byte;
    3. begin
    4. asm
    5. mov dx,SMBUsAddr
    6. mov cx,Addr
    7.  
    8. @loc_E92F7:
    9. in  al,dx   {+0 Читаем регистр статуса}
    10. out 0EBh,al {Задержка}
    11. out dx,al   {+0 Пишем в регистр статуса, что обнуляет его}
    12.  
    13. and al,0BFh
    14. or  al,al
    15. jnz @loc_E92F7 {Ждем пока контролер не освободиться???}
    16.  
    17. add dx,4    {+4 Регистр адреса нулевой бит определяет запись или чтение 1=Read 0=Write}
    18. mov al,ch
    19. or  al,1
    20. out dx,al
    21. mov al,cl
    22. dec dx      {+3 Регистр команды, для EEPROM это адрес ячейки}
    23. out dx,al
    24. dec dx      {+2 Регистр Host Controler регистр задает способ передачи}
    25. mov al,48h  {Способ передачи с Byte Data 010b }
    26. out dx,al
    27.  
    28. out 0EBh,al {Задержка}
    29.  
    30. xor cx,cx
    31. sub dx,2    {+0  регистр статуса}
    32.  
    33. @loc_E931C: {Порядок проверок важен!!!}
    34.  
    35. in al,dx
    36. out 0EBh,al {Задержка}
    37. test al,4   {ошибочки устройства}
    38. jnz  @loc_E932D
    39. test al,2   {Произошло прерывание}
    40. jz  @loc_E932B
    41. test al,80  {данные пришли}
    42. jnz  @loc_E932D
    43. @loc_E932B:
    44.  
    45. loop @loc_E931C
    46. @loc_E932D:
    47. out dx,al   {+0 Пишем в регистр статуса, что обнуляет его}
    48. add dx,5    {+5 Регистр данных Date0}
    49. in al,dx
    50. mov a,al
    51. end;
    52. ReadSMBus:=a;
    53. end;
    addr - нижней байт адрес ячейки/регистра устройства.
    верхний байт адрес устройства, но сдвинутый на 1 бит в лево.

    После того как считаешь SPD нужно разобрать, что считал.
    У Intel на сайте найдешь описание spdsd12a.pdf
     
  6. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    rudik
    идешь на сайт Intel
    скачиваешь документацию по 865PE (MCH) и ICH5
    по документации на ICH5 изучаешь работу с SMBus контроллером, а в документации на MCH смотришь раздел 5.2.5
     
  7. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    IMHO через DMI можно больше узнать. Плюс не надо порты юзать
     
  8. T800

    T800 Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    293
    Адрес:
    Moscow
    Можно глянуть исходники Mitec v10.
    Правда он SN планок не находит, в отличие от Everest.
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    10110111
    DMI вещь хорошая выводит много интерестного. Но не все точно выводит. Информацию о планках памяти там неполная.
     
  10. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    стоит отметить что SMBus есть не везде
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    NoName
    если не брать в рассчет компы 10 летней давности, то везде
     
  12. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    На некоторых промышленных платах применяющихся во встраиваемых системах бывает нету.
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    NoName
    Ты можешь просто и не знать о его существовании. На старых компах SMBus ищется иначе.
    Код (Text):
    1. const
    2. VDID_PIIX4=$71138086;
    3. VDID_AMD756PM=$740B1022;
    4. VDID_AMD766PM=$74131022;
    5. VDID_AMD768PM=$74431022;
    6. VDID_AMD8111PM=$746B1022;
    7.  
    8. for i:=0 to PCICount do
    9.  begin
    10.  PCI:=PCIListNum(i);
    11.  ReadPCICFGReg(PCI^.Addr+$00,Reg1);
    12.  if (Reg1=VDID_PIIX4) then
    13.   begin
    14.   ReadPCICFGReg(PCI^.Addr+$90,Reg1);
    15.   Addr:=Reg1 and $FFF0;
    16.   break;
    17.   end;
    18.  if (Reg1=VDID_AMD756PM)or(Reg1=VDID_AMD766PM)or(Reg1=VDID_AMD768PM)or(Reg1=VDID_AMD8111PM)   then
    19.   begin
    20.   ReadPCICFGReg(PCI^.Addr+$58,Reg1);
    21.   Addr:=Reg1 and $FFF0;
    22.   break;
    23.   end;
    У меня дома пентиум второй материнская плата там PIIX4. Компу уже 9 лет. Так вот одна планка на 16 друга на 128. Та что на 16 не читается просто отсутствует SPD блок.
     
  14. abcd008

    abcd008 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2009
    Сообщения:
    616
    где можно найти все адреса устройств на шине smbus
    я знаю только 50h-57h spd памяти

    А где найти остальные?
     
  15. Lux_In_Tenebris

    Lux_In_Tenebris New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2008
    Сообщения:
    13
  16. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    http://www.wasm.ru/forum/viewtopic.php?id=14139 post #16