Программная оценка распределения памяти

Хачатуров А.М., Демеш Н.С.
Донецкий национальный технический университет


Источник: Інформатика та комп'ютерні технології - 2011 / Матеріали III науково-технічної конференції молодих учених та студентів. - Донецьк, ДонНТУ - 2011, с. 77-78.


Аннотация:

Хачатуров А.М., Демеш Н.С. Программная  оценка распределения памяти.В статье проанализированы программные способы получения информации об объеме и типе оперативной памяти, а так же разработан алгоритм чтения  параметров модулей памяти SPD.

 

Актуальность

Рассматриваемая задача является частью архитектурного мониторинга производительности компьютера и находится на границе аппаратного и программного обеспечения.

Память - одна из наиболее важных подсистем компьютера и ее работа должна быть стабильной. Сбои в работе памяти могут стать причиной потери ценной пользовательской информации и части системной ОС. Особым случаем является несовместимость модулей памяти разных производителей между собой или с материнскими платами.

При эксплуатации памяти важно точно знать ее действительные характеристики. Современные материнские платы допускают настраивать некоторые параметры, информация о которых считывается с самих модулей памяти. Это, в первую очередь значения таймингов, которые хранятся в специальной памяти SPD, находящейся на модуле.

Система идентифицирует модули памяти по протоколу Serial Presence Detect(SPD). Модуль SPD, это энергонезависимая микросхема EPROM(объёмом 256 байт), в которой содержится информация о модуле памяти, необходимая для его правильного конфигурирования: серийные номера изделий и имена производителей и т.д. BIOSсчитывает эти данные при запуске, и для инициализации использует их. Запущенные под ОС программы диагностики читают SPD. При сравнении объема оперативной памяти, выделяемой ОС и BIOSс реальной емкостью установленных модулей, можно обнаружить разницу.

Названные причины свидетельствуют о том, что способы программной оценки объема памяти, ее распределения, а так же доступ к SPD  является актуальными задачами в создании архитектурной базы конкретной платформы персонального компьютера.

 

Алгоритм определения объема памяти

Разработанный алгоритм программы реализует функции определение объема установленной памяти, получение карты распределение оперативной памяти , чтение содержимого микросхемы SPD.

            Определение объема оперативной памяти выполняется при помощи прерывания BOIS int 15h ax=E810h[2]. Оно позволяет определить объем установленной памяти  до 4Гб. Прерывание возвращает в регистр AX количество 64 кб. блоков между 1 и 16 мегабайтами установленной памяти, в регистр BX количество 64кб. блоков  между 16мб. и 4гб. установленной памяти, считав значение этих регистров определяем объем установленной оперативной памяти.

            Получение карты распределение адресного пространства установленной памяти выполняем при помощи прерывания BIOS int15h AX=E820h. Оно позволяет формировать карту распределения адресного пространства  оперативной памяти. В качестве входных параметров передается указатель на буфер в регистре ES:DI, объем буфера в регистре ECX, EBX, для первого вызова равна “0 ”, для последующих вызовов в EBXбудет адрес следующего блока памяти, которое будет возвращено пред идущем вызовом прерывания. После удачного вызова прерывания в буфер возвращаются значение, характеризующие рассматриваемый участок памяти. [3]   Структура возвращаемых данныхПриведена в таблице 1.


 

Таблица 1. Структура возвращаемых данных

Смещение Название Описание
0 BaseAddrLow Low 32 Bits of Base Address
4 BaseAddrHigh High 32 Bits of Base Address
8 LengthLow Low 32 Bits of Length in Bytes
12 LengthHigh High 32 Bits of Length in Bytes
16 Type Address type of  this range

Поле Typе определяет возможные типы памяти, его структура приведена в таблице 2.


Таблица 2. Структура поля Typе.

Значение Описание
1 AddressRangeMemory, available to OS
2 AddressRangeReserved, not available to OS
3 AddressRangeACPI, available to OS
4 AddressRangeNVS,not available to OS

               Вызов данного прерывания выполняется в цикле, пока значение регистра EBX не будет равно “0”.

 

Чтения SPD

Ни один современный модуль памяти не может обойтись без компонента — микросхемы SPD (Serial Presence Detect). Интерфейс последовательного детектирования, регламентированный на данный момент для всех модулей памяти форм-фактора SIMM/DIMM/RIMM, использует шину управления системой (SMBus — System Management Bus), совместимый со спецификацией Inter-IC (I2C или IIC). Принцип использования шины SMBus в случае SPD сводится к передаче данных от микросхемы EEPROM.

для доступа к SPDнеобходимо использовать конфигурационные регистры шины SMBus, которые находятся в конфигурационном пространстве PCI.

Конфигурационное адресное пространство PCI  состоит из 256 байт, которые можно адресовать, зная номер шины PCI, номер устройства и номер функции в устройстве. Первые 64 байта из 256 стандартизированы, а остальные регистры могут быть использованы по усмотрению изготовителя устройства.

доступ к PCI через порты I/O.   для работы с шиной PCI в PC-AT и совместимых машинах выделено два основных порта:

-0CF8h -W порт адреса Address.

-0CFCh RW порт данных Data.

Оба порта являются 32 битными. Порт адреса представляет собой следующую 32 битную структуру, которая задает шину, устройства, и адрес регистра в конфигурационном пространстве устройства. Структура  порта адреса приведена в таблице 3.


Таблица 3. Порт адреса.  

31 30.....24 23.....16 14....11 10....8 7....2 1 0
C Резерв Шина устройство функция Индекс регистра

В этой структуре устройство - это физически присутствующее устройство, где функция - это логическое устройство.С - флаг доступа к устройству. Младшие два бита в порту адреса всегда 0.По окончании работы с устройством следует сбросить адрес в 0.

Первым шагом в доступе к микросхеме SDPявляется создание списка PCIустройств, путем последовательного перебора всех возможных адресов PCIи запроса чтения нулевого регистра. Если в ответ на запрос нулевого регистра возвращается 0FFFFh, то устройства не существует. Если устройство существует мы запоминаем его адрес в списке устройств.

Вторым шагом является поиск шины SMBusв полученном списке PCI  устройств. Поиск осуществляется путем опроса каждого адреса из списка PCIустройств и проверки содержимого конфигурационных регистров, с целью поиска признаком SMBusшины[4].

Третий шаг. В случае если шина SMBusнайдена, выбираем один из возможных адресов SDP(50h,51h,52h,53h), после чего выполняем побайтное чтение 256 байт в буфер, начиная с текущего адреса.

Следующим этапом является взаимодействие с контроллером SMBus через его диапазон портов ввода-вывода. Базовый адрес SMB_Base. Обнуляем статусные биты в регистре Host Status (SMB_Base+0) для подготовки контроллера к очередной операции. Биты этого регистра используют дисциплину Read/Write Clear, и обнуляются при записи "1" в них.

 Посылаем 8-битный адрес ячейки микросхемы SPD, которую требуется прочитать. Он записывается в регистр Host Command (SMB_Base+3). При выполнении транзакции на шине SMBus, значение этого регистра передается в поле Command.

Передаем 8-битный адрес микросхемы SPD, к которой выполняется обращение. Он записывается в регистр Transmit Slave Address (SMB_Base+4). При выполнении транзакции на шине SMBus, значение этого регистра передается в поле Slave Address.

            Запускаем выполнение транзакции, параметры которой были подготовлены . Для этого необходимо записать код операции в регистр Host Control (SMB_Base+2). Для запуска операции передачи байта используется код 01001000b = 48h.

Контроллер SMBus начинает операцию чтения байта из SPD. Программа должна ожидать завершения операции. Опрашиваем состояние бита Host Busy, это бит 0 регистра Host Status (SMB_Base+0). По значению Host Busy=1 определяем момент начала операции, затем ожидаем Host Busy=0, то есть завершения операции. Отсутствие ожидаемого события в течение заданного интервала (около 50 мс) интерпретируется как ошибка – таймаут шины.

            Считываем из регистра Host Data 0 (SMB_Base+5) байт, прочитанный из SPD. Его значение достоверно только при отсутствии ошибок.

 Проверяем отсутствие ошибок. Для этого считываем регистр Host Status (SMB_Base+0) и анализируем статусные биты. После успешного завершения транзакции, состояние битов 4-1 должно быть 0001b. Маскируем указанное битовое поле и проверяем его значение.

Получив 256 байт проверяем  их значение, если все байты равны FF, то SPDпо данному адресу недоступна. Если SPDприсутствует, то выполняем анализ интересующих нас битов из считаного буфера. Результат работы программы представлен на рисунке 1.  

 

Рисунок 1. Фрагмент результата работы программы. Адрес шины SMBusи содержимое SPD.

 

Выводы

Тестирование программы показало, что она успешно выполняет поставленные задачи: определение объема оперативной памяти, установленной на компьютере, создание карты распределения памяти, чтение микросхемы SPD. Способ доступа к SDP, рассмотренный в данной статье имеет особенности  связанные с реализация доступа к шине SMBusразлична на разных чипсетах. Разработанная программа может быть использована при разработке операционных систем “с нуля”, разработке специализированного программного обеспечения для диагностики, поскольку может быть запущено на частично исправной системе и выполнить свои функции, при отладке процесса взаимодействия функций программы с аппаратурой.

Литература

1.OSDev Wiki [Electronic resource]/ Интернет-ресурс. – Режим доступа: www/URL : http://ru.osdev.wikia.com/wiki/Карта_распределения_памяти

2.INTERRUPT LIST [Electronic resource]/ Интернет- Ресурс. – Режим доступа: www/URL :  http://www.ctyme.com/intr/rb-1739.htm

3.INTERRUPT LIST [Electronic resource]/ Интернет- Ресурс. – Режим доступа: www/URL :  http://www.ctyme.com/intr/rb-1741.htm

4.SMBus[Electronic resource]/ Интернет-ресурс. –Режим доступа: www/URL :http://smbus.org/

5.JEDEC[Electronic resource]/ Интернет-ресурс. –Режим доступа: www/URL: http://www.jedec.org/

6.М. Гук. Аппаратные средства IBM PC. Энциклопедия. 3-е изд.[Текст]/ М. Гук// “Питер” 2008.-C.1072.

7.INTEL[Electronic resource]/ Интернет-ресурс. –Режим доступа: www/URL : http://www.intel.com/index.htm?ru_RU_05