Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Жесткий кодинг

Крис Касперски

Хакер, номер #093, стр. 093-136-3


В порт CF8h заносится адрес регистра, с которым мы хотим работать (называемый так же смещением или offset'ом), а через порт CFCh происходит обмен данными, который в зависимости от конструктивных особенностей конфигурируемого контроллера может быть доступен как на запись/чтение, так и только на чтение. Под "регистром" здесь понимается отнюдь не регистр процессора (типа EAX), а регистр контролера. Некоторые регистры отображаются на порты ввода/вывода (и тогда с ними можно работать командами IN/OUT), некоторые — нет и с ними можно работать только через CF8h/CFCh.

Большинство регистров представляют собой совокупность управляющих битов, поэтому перед тем как что-то записывать в порт CFCh, мы, как правило, сперва должны прочитать текущее состояние чипсета, взвести/опустить нужные нам биты при помощи операций OR и AND, после чего затолкать обновленный регистр на место (однако, если текущее состояние нас не интересует, выполнять операцию чтения совершенно необязательно).

Описание самих регистров можно найти в документации на северный и южный мосты чипсета. Где-то там будет раздел "PCI Configuration Registers", "Registers Description" или что-то в этом роде.

В частности, регистр 114h северного моста чипсета Intel 915, управляет таймингами DDR-памяти и делает он это с помощью своих битов, комбинация которых задает то или иное состояние DRAM-контроллера. Конкретные значения приведены в таблице 1, которую можно найти на 102 странице оригинального руководства: intel.com/design/chipsets/datashts/301467.htm

Таким образом, чтобы настроить память на максимальную производительность, необходимо занести в регистр 114h число 10000000000001000000000b (или 400200h в шестнадцатеричном виде), что на языке ассемблера делается так:

Ассемблерный код, устанавливающий таймиги DDR-памяти на максимальную производительность, игнорируя информацию записанную в SPD (только для чипсета Intel 915! обладатели других чипсетов должны заменить подчеркнутые константны в соответствии со своей документацией)

mov eax, 114h ; регистр чипеста, управляющий DRAM-контроллером

mov dx, 0CF8h ; PCI-порт (адрес регистра)

out dx, eax ; выбираем регистр

mov dx, 0CFCh ; PCI-порт (данные)

in eax, dx ; читаем содержимое регистра 114h

or eax, 400200h ; конфигурируем таймиги памяти

out dx, eax ; записываем регистр чипсета

Заключение

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

Назад на стр. 093-136-2  Содержание  Вперед на стр. 093-136-4