Автор: lonesome TSH/Digital Daemons
Дата: .01.2003
Раздел: Разработка ОС
Сейчас мы рассмотрим один из способов, применяемых при загрузке ОС - загрузка с дискеты. Действия, предпринимаемые БИОС при загрузке с дискеты, таковы:
Поскольку один сектор - это всего лишь 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 байт.