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

Оказалось, что для этого достаточно написать код, который бы размещался в первом секторе дискового устройства и имел в конце сектора сигнатуру 055AAh. BIOS, найдя указанную сигнатуру, загрузит код этого сектора по адресу 0000h:7С00h и передаст на него управление. И тут уже всё зависит от собственной фантазии и поставленных целей, какой код для этого писать и что он должен делать. Обычно этот код служит загрузке ОС, но никто не мешает написать демку, игру, или приложение для тестирования компьютера, исследования его железа, и тому подобное, что бы запускалось после старта компьютера и не дребовало наличия иного ПО.

Данная структура, которую BIOS загружает в память, называется MBR (master boot record или главная загрузочная запись) и прочитать о ней можно здесь. Как там написано, структура эта применялась с 1983 года, но в настоящее время применяется новый формат GPT, который, тем не менее, содержит в себе и MBR для совместимости.

Рисунок 1. Сравнение структур MBR и GPT. (Взят с https://www.mustbegeek.com/difference-between-mbr-and-gpt)

Да и сама BIOS уже практически ушла в историю, более десятилетия проэмулировавшись для совместимости. На смену ей пришло UEFI, частью которого и является GPT. Однако, знание истории и путей развития компьютерных технологий может быть весьма полезно и само по себе. Но всё же, на современном железе код рассматриваемой программы может и не заработать. И виртуальная машина тут в помощь.

В рассматриваемой программе, из всех тех полей, которые указаны на рисунке 1, используются только два — Master Boot Code и сигнатура 0x55AA. Для того, чтобы программа заработала, этого вполне достаточно. Сама сигнатура 0x55AA выбрана совсем не случайно. В двоичном виде она выглядит так b101010110101010, или, для лучшей наглядности:

b01010101
b10101010

Помимо определения загрузочного устройства, она так же служила для тестирования дискового привода. Если устройство имеет 8-ми битную шину данных, как это было с контроллером гибких дисков 8272A, то такая двухбайтовая комбинация позволяет протестировать каждую из восьми линий передаци данных на способность находится как на низком, так и на высоком логическом уровне.

Другая задача, которую нужно решить при разработке подобной программы, это разобраться с распределением оперативной памяти, чтобы знать, какие её области и как можно использовать. Ведь запускаться она будет в реальном режиме работы x86 процессора, с сегментной адресацией, при которой размер сегмента, как непрерывно адресуемого участка, равен 64 Kb, а всё доступное адресное пространство ограничено 1 мегабайтом. Да ещё и с учётом того, что не весь этот мегабайт может быть одинаково доступен. Впрочем, даже не зная этого, код может получиться вполне рабочим, и успешно выполняться. Однако, только до тех пор, пока довольно жёсткие рамки не будут нарушены. На рисунке 2 приведена типичная карта адресного пространства IBM PC совместимого компьютера.

Рисунок 2. Типачная карта первого мегабайта памяти IBM PC совместимого компьютера. (Взят с http://petesqbsite.com/sections/tutorials/zines/chronicles/3-ems.html)

Более подробно с её распределением можно познакомиться здесь. Память выше первого мегабайта данной программе не доступна. Она не изменяет реальный режим работы, а так же не активирует доступ к HMA. Область выше 640 Kb так же недоступна, это область UMA, зарезервированной IBM для ПЗУ материнской платы и проецирования портов ввода-вывода аппаратных ресурсов. Область ниже 0000h:0500h отводится под данные BIOS и таблицу векторов прерываний. Таким образом, для выполнения программы остаётся пространство адресов от 0000h:0500h до 9000h:FFFFh — немногим менее 639 Kb.

Данная программа полагает, что 640 Kb основной оперативной памяти (первые 640Kb) наличиствуют в любом случае. Однако, для большей правильности, следовало бы это проверять, вызвав прерывание INT 12h и получив в регистре AX её размер в килобайтах.

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

Всё, что она делает, это, после запуска, выводит данные о своём выполнении в верхнюю строку экрана. Далее, циклично, отображает на оставшуюся часть экрана свой код, представленный как ASCII. Периодически стартовый адрес начала вывода кода начинает изменяться, создавая впечатление о прокрутке перфоленты со странными символами.

Для запуска программы достаточно выбрать получившийся образ crazy.img для привода гибких дисков в созданной виртуальной системе под какой-либо программой для запуска виртуального компьютера. Например VirtualBox. И запустить виртуальный компьютер. О создании виртуального компьютера под MS-DOS рассказывалось в прошлой заметке. Созданная там виртуальная машина вполне может быть использована и для запуска данной программы, возможно только потребуется указать приоритет выбора привода гибких дисков в качестве загрузочного устройства в «Settings->System».

Рисунок 3. Окно VirtualBox с запущенной программой.

Исходный код

Исходники

Добавить комментарий