На главную страницу Скачать Статьи Ссылки
Форум Гостевая книга Старая главная страница О сайте

Программа для работы с микрокодами процессоров Intel.

Как известно, микропроцессоры Intel имеют обновляемый микрокод, что позволяет исправить некоторые ошибки, допущенные на этапе разработки микропроцессора. Некоторое время назад пришлось столкнуться с переделкой материнской платы Socket 370 под tualatin, соответственно, пришлось обновлять BIOS на предмет новых микрокодов. Идея меня заинтересовала, и, хотя, новый микрокод уже давно был добавлен в BIOS было решено написать небольшую программку для модификации файла cpucode.bin, присутствующего в большинстве BIOS’ов от AWARD.

Начитавшись статей на www.ixbt.com и на www.rom.by был найден формат файла для микрокодов. Все микрокоды имеют размер 2048 байт, из которых 48 байт представляют заголовок файла, а оставшиеся 2000 байт – непосредственно обновляемый микрокод.

Формат микрокода (взят с www.ixbt.com):

Смещение (16cc.)

Длина (10cc.) или формат

Описание

+0

двойное слово

Номер версии формата (не встречал отличное от 1)

+4

двойное слово

Номер версии блока для данного CPUID

+8

4 байта

Дата выхода данной версии блока

+8

слово

Год выхода (0x9919 - 1999 год)

+A

байт

День выхода (0x12 - 12-е число)

+B

байт

Месяц выхода (0x12 - декабрь)

+C

слово

CPUID процессора, для которого предназначен блок

+E

слово

Не используется (заполнено нулями)

+10

4 байта

??? Возможно, - контрольная сумма

+14

двойное слово

Номер версии формата (???, не встречал отличное от 1)

+18

двойное слово

PKG (Package) процессора

+1C

двойное слово

Не используется (заполнено нулями)

+20

16 байтов

Не используется (заполнено нулями)

+30

до конца блока

Содержательная часть (собственно исправления микрокода)

То же самое на языке Delphi:

Type

   cpucode = record

      formatver1 : dword;       { Номер версии формата 1 }

      cpuid1     : byte;

      cpuid2     : byte;

      cpuid3     : byte;

      cpuid4     : byte;

      year       : word;        { Год в формате BCD }

      day        : byte;        { День в формате BCD }

      Month      : byte;        { Месяц в формате BCD }

      _cpuid     : word;        { CPUID процессора }

      reserved1  : word;        { Не используется - заполнено нулями }

      _crc       : dword;       { Возможно контрольная сумма }

      formatver2 : dword;       { Номер версии формата 2 }

      pkg        : dword;       { PKG (Package) процессора }

      reserved2  : dword;       { Не используется - заполнено нулями }

      reserved3  : array[1..16] of byte; { Не используется - заполнено нулями }

      microcode  : array[$31..$800] of byte;

   end;

В соответствии с этим форматом был написана программка a-la плагин для Far Manager Multiarc, который позволяет работать с файлом cpucode.bin как с архивом, формат имен файлов на «выходе» программки частично совпадает с базой all_microcodes.rar с сайта www.rom.by.

Скачать исходник

     

Скачать файл custom.ini

Дальше – больше. Изучая микрокоды, зашитые в файл update.sys операционной системы Windows XP SP3 и BIOS’ ы материнских плат с LGA 775, в которых, кстати, cpucode.bin отсутствует, и микрокоды представлены в несжатом виде (я так и не нашел «правильного» способа извлекать их, приходится ручками находить начало блока данных в файле и «вырезать»).

Оказалось, что все, что написано выше, верно только отчасти. Все только подтвердилось, когда с сайта www.intel.com был скачан файл с микрокодами microcode-20080910.dat (ну не нашел я там файла в бинарном виде, поэтому была написана программка, формирующая файл в формате cpucode.bin). Было выяснено, что размер микрокода не обязательно равен 2048 байт, он может быть и больше, но обязательно кратен 1024 байт (ам). Для дальнейшего анализа исходный файл был разделен на блоки по 1024 байта, которые в дальнейшем были распределены на основе наличия или отсутствия заголовка. Оказалось, что в базе от Intel имеются микрокоды с размером файла 2048, 3072, 4096, 5120, 7168 и 8192 байта. Анализом было установлено, что формат заголовка несколько изменился и теперь представляется следующей структурой (на языке Delphi):

Type

   cpucode = record

      formatver1 : dword;     { Номер версии формата 1 }

      cpuid1     : byte;

      cpuid2     : byte;

      cpuid3     : byte;

      cpuid4     : byte;

      year       : word;      { Год в формaте BCD }

      day        : byte;      { День в формaте BCD }

      Month      : byte;      { Месяц в формате BCD }

      _cpuid     : word;      { CPUID процессора }

      reserved1  : word;      { Не используется - заполнено нулями }

      _crc       : dword;     { Возможно контрольная сумма }

      formatver2 : dword;     { Номер версии формата 2 }

      pkg        : dword;     { PKG (Package) процессора }

      fsize2     : dword;     { Размер микрокода без заголовка }

                              { если равно нулю, то fsize=2000 }

      reserved3  : array[1..16] of byte;

                          { Не используется - заполнено нулями }

                          { в "новом" формате используется,    }

                          { формат не ясен                     }

      microcode  : array[$31..$400] of byte;

   end;                   { Блоки кратны 1024 байт(ам)         }

Программка была переписана с учетом этих изменений.

Скачать исходник

 

Скачать статью в формате pdf

Комментарии? Поправки? Дополнения? mehFK@narod.ru

При публикации статей ссылка на сайт с http://mehfk.narod.ru/ обязательна.

Публикация статьи на диске (или ином электронном носителе) или бумаге разрешается только с согласия mehFK.

На главную страницу Скачать Статьи Ссылки
Форум Гостевая книга Старая главная страница О сайте
Hosted by uCoz