На главную страницу | Скачать | Статьи | Ссылки |
Форум | Гостевая книга | Старая главная страница | О сайте |
Программа для работы с микрокодами процессоров 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.
Дальше – больше. Изучая микрокоды, зашитые в файл 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 байт(ам) } |
Программка была переписана с учетом этих изменений.
Комментарии? Поправки? Дополнения? mehFK@narod.ru
При публикации статей ссылка на сайт с http://mehfk.narod.ru/ обязательна.
Публикация статьи на диске (или ином электронном носителе) или бумаге разрешается только с согласия mehFK.
На главную страницу | Скачать | Статьи | Ссылки |
Форум | Гостевая книга | Старая главная страница | О сайте |