Загрузчик с дискеты
Сейчас мы рассмотрим один из способов, применяемых при загрузке ОС -
загрузка с дискеты. Действия, предпринимаемые БИОС при загрузке с дискеты,
таковы:
Считывание первого (загрузочного) сектора дискеты в оперативную
память по адресу 0000:7C00
Передача управления в эту точку - т.е. при старте загрузчика в
сегментном регистре CS находится 0. Остальные сегментные регистры
необходимо проинициализировать самостоятельно
Поскольку один сектор - это всего лишь 512 байт, то возможности
первичного загрузчика ограничены. Обычно его задача - загрузка вторичного
загрузчика (например в ОС Linux, второй загрузчик именуется Setup),
который уже выполняет загрузку ядра, переход в защищенный режим и пр.
При выполнении первичного загрузчика процессор находится в реальном
режиме.
Ниже приведен исходник простого загрузчика, который считывает 17
секторов (8704 байт) по адресу 7E00 и передает им управление (все
ассемблерные примеры, которые я буду приводить, предназначены для
компиляции с помощью свободно распространяемого мультиплатформенного
ассемблера NASM (nasm.sourceforge.net)):
BITS 16
;Вторичный загрузчик будет загружен по этому адресу:
%define SECOND 0x7e00
org 0x7C00
section .text
start:
xor ax, ax
cli ;перед установкой стека отключим прерывания
mov ss, ax
mov sp, start
sti ;нам понадобятся прерывания БИОС
mov ds, ax ;загрузим необходимые сегментные регистры нулем
mov es, ax ;
mov ch, 0 ;Цилиндр
mov bx,SECOND ;Адрес по которому будут записаны данные
mov ah, 02h ;Функция диского сервиса 02 - чтение секторов
mov al,17 ;Число секторов
mov cl,2 ;Сектор, с которого начать
mov dl,0 ;Диск (дисковод А - 0)
mov dh,0 ;Головка
int 0x13 ;Прерывание 0x13 - дисковый сервис БИОС
jmp SECOND ;Переход на вторичный загрузчик
Для упрощения программы мы не выполняли проверку правильности
считывания. Загрузчик предполагает, что код вторичного загрузчика
находится на дискете сразу за первым сектором - т.е. начиная с 512 байт.