Предыдущий раздел НАЧАЛЬНЫЕ ЗАГРУЗЧИКИ Следующий раздел

22.2.1. Укрупненная структура

Первичный начальный загрузчик занимает первый сектор логического диска длиной 512 байт и имеет следующую укрупненную структуру:

 

org    7c00h                           ; Смещение относительно начала сегмента ОП

jmp    near  Begin        ; Переход на начало кода

;                           Описательный блок

B_1            times  8       db  0                    ; Название ОС

B_2            dw     0                                   ; Размер сектора (байт)

         .     .     .     .     .     .     .     .            

;                           Другие данные программы

Begin:                                                        ; Начало кода

.     .     .     .     .     .     .     .   ; Команды загрузчика

         .     .     .     .     .     .     .     .            

 

; Заполнение оставшегося места в секторе нулями с целью точного

;        размещения загрузочной сигнатуры 

times   510-($-$$)      db  0

; Загрузочный сектор заканчивается загрузочной сигнатурой

boot_signature:   dw  0aa55h

 

По относительному адресу 7c00h находится 3-байтовая команда перехода jmp, которая «перескакивает» через описательный блок загрузочного сектора на  исполнительные команды (код) загрузчика. Описательный блок загрузочного сектора имеет длину 64 байта и содержит информацию об используемой файловой системе и о размещении информации на диске. Содержание описательного блока для FAT12 и FAT16 приведено в табл.10.  

 

Т а б л и ц а  10. Структура описательного блока

 

Первоначальная запись в описательный блок производится транслятором в результате обычной инициализации данных. После того, как первичный загрузчик будет записан программой POST BIOS в ОП, POST BIOS может, прежде, чем передать управление первичному загрузчику, заменить содержимое некоторых полей в описательном блоке. При этом особый интерес представляет запись в поле 14 (номер дискового устройства). Некоторые BIOS записывают в это поле сам номер дисковода. Другие BIOS помещают в это поле число FFh, а номер дисковода передают на вход первичного загрузчика в регистре DL.  

Последние два байта загрузочного сектора содержат загрузочную сигнатуру (слово) – AA55h (в младшем байте – 55h, в старшем байте – AAh). Если POST BIOS обнаружит это слово в конце первого сектора логического диска, то он будет считать этот диск загрузочным.

Рассмотрим записанный перед загрузочной сигнатурой псевдооператор

times   510-($-$$)      db  0

Его наличие обеспечивает точное размещение загрузочной сигнатуры в двух последних байтах загрузочного сектора. Данный оператор «вычисляет» расстояние между кодом загрузчика и предпоследним байтом загрузочного сектора и заполняет это пространство памяти нулями. В самом деле, $ – смещение текущей команды относительно начала сегмента ОП. $$ – тоже смещение, но начала кода программы, то есть смещение, заданное в операторе org. Таким образом, ($-$$) есть размер программы (в байтах) до текущей позиции.

 


Предыдущий раздел В начало Следующий раздел