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

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

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

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


Программирование компьютерного железа

В программировании голого железа есть какое-то непередаваемое словами очарование в котором мало практической пользы, но зато огромное эстетическое удовлетворение и наслаждение. Сегодня мы спустимся на самый низкий уровень, который только возможно достигнуть на IBM PC! Держись, мы будем программировать не только без операционной системы, но даже без BIOS'а!

На прикладном уровне обитать неинтересно. Здесь все приходится делать через готовые интерфейсы (типа win32 API и иже с ними), громоздящиеся своими иерархическими слоями друг на друга. С этой точки зрения, программирования под x86 мало чем отличается от той же Альфы. Мы упираемся в операционную систему, становясь ее пленниками, заключенными в тесную клетку со спертым воздухом.

Без оси жизнь становится намного более захватывающей и интересной. Можно напрямую обращаться ко всем портам ввода-вывода (и знать, что это реальные порты, а не какие-то там виртуальные), выполнять все привилегированные инструкции, переходить в защищенный режим и возвращаться обратно. В общем, делать все, что заблагорассудится. Вот только…основное компьютерное оборудование (и, в первую очередь, чипсет) на этом уровне нам неподвластно. Точнее, подвластно, но не совсем. Конфигурирование и настройка чипсета осуществляется на стадии начальной инициализации компьютера во время загрузки BIOS, подготавливающей его к работе. Некоторые параметры могут быть изменены позднее как через порты ввода/вывода, так и через саму BIOS, но основной фундамент остается непоколебимым. А жаль… ведь далеко не всякая версия BIOS использует возможности аппаратуры на 100%, к тому же лишает нас радости живого общения с железом, подавая его на стол готовеньким. А если нам хочется отведать мяса с кровью?! Тогда необходимо перепрограммировать BIOS, а точнее небольшую его часть, называемую boot-блоком и наиболее приближенную к аппаратуре.

Перепрограммирование boot-блока открывает огромные возможности для трюкачества, позволяя раскрыть свой творческий потенциал и показать на что ты способен. Да что там говорить! Это по-настоящему сложно, а значит, реально круто!

Исходные реагенты или что нам понадобится

Прежде всего, нам понадобится материнская плата, которую не жалко потерять (в том смысле, что ее смерть не станет трагедией). Еще нужен программатор (поскольку не все матери дают прошивать boot-блок, а за пределами boot-блоком жизнь уже становится не такой интересной), который легко купить на радио рынке; любая программа для редактирования BIOS'a (обычно идущая на диске, прилагаемом к материнской плате или лежащая на сайте производителя); прошивка BIOS'а для изучения и подражания (скопированная из самого BIOS или скаченная с сайта); транслятор ассемблера, умеющий генерировать двоичные файлы (FASM, NASM) и, наконец, документация на чипсет (Intel и AMD раздают ее бесплатно, остальные производители — только своим партнерам, зачастую под подписку о неразглашении, как будто там есть что разглашать).

Ликбез или как все это работает

После "холодной" перезагрузки или включения питания, процессор, находящийся в реальном режиме, передает управление по адресу F000h:FFF0h, где находится точка входа в BIOS. В древних IBM AT микросхема постоянной памяти физически "висела" на процессорной шине, непосредственно отображаясь на 64-Кбайтный регион памяти от F000:0000 до F000:FFFF. Современные прошивки в этот объем уже не вмещаются и занимают порядка 512 Кбайт (да и то в упакованном виде), что составляет половину адресного пространства реального режима. Поэтому, в память непосредственно отображаются лишь 64 Кбайт прошивки (порядка 4 Кбайт из которых составляет boot-блок), а остальные части прошивка должна уметь считывать из микросхемы Flash-BIOS'а самостоятельно, обращаясь к специальному контроллеру, как правило, "вживленному" в южный мост чипсета и соединенному с BIOS'ом по LPC или ISA шине.

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