Жесткий кодинг Крис Касперски Хакер, номер #093, стр. 093-136-4 Совет: прежде чем писать свой мини-BIOS, выводящий на экран зеленый травянистый семилистник под мелодию "семь сорок", раздающуюся из спикера, скачай готовую прошивку и дизассемблируй boot-блок, разобравшись как он работает. Мы увидим много обращений к портам, часть из которых удается расшифровать с помощью документации на чипсет, часть — обратившись к описанию остальных контроллеров и микросхем, установленных на плате. Фрагмент прошивки AMI-BIOS seg010:DB6D 55 push bp seg010:DB6E 8B EC mov bp, sp seg010:DB70 83 EC 08 sub sp, 8 seg010:DB73 C6 45 F8 41 mov byte ptr [di-8], 'A' seg010:DB77 C6 45 F9 4D mov byte ptr [di-7], 'M' seg010:DB7B C6 45 FA 49 mov byte ptr [di-6], 'I' seg010:DB7F C6 45 FB 42 mov byte ptr [di-5], 'B' seg010:DB83 C6 45 FC 49 mov byte ptr [di-4], 'I' seg010:DB87 C6 45 FD 4F mov byte ptr [di-3], 'O' seg010:DB8B C6 45 FE 53 mov byte ptr [di-2], 'S' seg010:DB8F C6 45 FF 43 mov byte ptr [di-1], 'C' seg010:DB93 53 push bx seg010:DB94 56 push si seg010:DB95 33 F6 xor si, si seg010:DB97 8B 45 08 mov ax, [di+8] seg010:DB9A 8B 50 20 mov dx, [bx+si+20h] seg010:DB9D 85 D2 test dx, dx seg010:DB9F 74 3A jz short loc_A9BDB В конечном счете мы создадим свой boot-блок, ассемблируем и, воткнув в программатор FLASH-BIOS, зальем туда свое творение (предварительно сохранив оригинальную прошивку). Не стоит надеяться, что материнская плата "проглотит" его с первого раза. Будет только черный экран, не реагирующий на клавиатуру и все. Даже курсора не будет. Попробуй угадай, в каком месте сидит ошибка!!! Но ведь только так из юноши программисты становятся настоящими мужчинами. В смысле хакерами. После недели-другой непрекращающихся мытарств мы, наверное, сможем оценить какого приходилось нашим предкам, дырявящим перфокарты и совсем незнакомым с понятием интерактивной отладки. Порядок инициализации оборудования Порядок инициализации оборудования не высечен на камне и допускает довольно большие вольности, однако, определенные традиции и нормы приличия все-таки нужно соблюдать. Материнские платы от EPOX выгодно отличаются тем, что имеют 2х разрядный сегментный индикатор, отображающий ход загрузки, что облегчает диагностику поломки (если таковая есть) и упрощает дизассемблирование BIOS, поскольку… код, отображаемый на индикаторе, в листинге присутствует в виде константы, расшифровку значения которой можно найти в руководстве в приложении E. Лучших комментарий к листингу, пожалуй, и не придумаешь! На остальных материнских платах порядок инициализации оборудования не сильно отличается от EPOX'а и все происходит приблизительно следующим образом: * тест CMOS на чтение/запись; * отключение теневой RAM; * инициализация базовых регистров чипсета; * чтение информации из SPD и инициализация DRAM-контроллера; * распаковка сжатого BIOS в оперативную память; * копирование BIOS в теневую RAM в сегменты E000h и F000h; * инициализация интерфейса 8042 (интегрированного в южный мост); * запуск самотестирования 8042; * детектирование микросхемы FLASH-ROM; * загрузка процедуры "прожига" FLASH в сегмент F000h (для поддержки DMI & ESCD); |